反射 黑马程序员

public class ReflectTester {
 public Object copy(Object object) throws Exception {
  // 获得对象的类型
  Class<?> classType = object.getClass();
  System.out.println("Class:" + classType.getName());
  // 通过默认构造方法创建一个新的对象,new Class[] {} 没参数表示用默认的构造方法
  Object objectCopy = classType.getConstructor(new Class[] {})
    .newInstance(new Object[] {});
  // 获得对象的所有属性,包括私有的
  Field fields[] = classType.getDeclaredFields();
  for (int i = 0; i < fields.length; i++) {
   Field field = fields[i];
   String fieldName = field.getName();
   String firstLetter = fieldName.substring(0, 1).toUpperCase();
   // 获得和属性对应的getXXX()方法的名字
   String getMethodName = "get" + firstLetter + fieldName.substring(1);
   // 获得和属性对应的setXXX()方法的名字
   String setMethodName = "set" + firstLetter + fieldName.substring(1);
   // 获得和属性对应的getXXX()方法 ,根据名字和参数取得对应的方法,getXXX()是没参数的,所以传个空的
   Method getMethod = classType.getMethod(getMethodName,
     new Class[] {});
   // 获得和属性对应的setXXX()方法,setXXX(Object obj),setXXX是有参数的,所以传当前字段的类型
   Method setMethod = classType.getMethod(setMethodName,
     new Class[] { field.getType() });
   // 调用原对象的getXXX()方法,调用getXXX()取得原对象的值
   Object value = getMethod.invoke(object, new Object[] {});
   System.out.println(fieldName + ":" + value);
   // 调用拷贝对象的setXXX()方法,调用新对象的setXXX()把值设置进去
   setMethod.invoke(objectCopy, new Object[] { value });
  }
  return objectCopy;
 }
 public static void main(String[] args) throws Exception {
  Customer customer = new Customer("Shmilyzl", 25);
  customer.setId(new Long(1));
  Customer customerCopy = (Customer) new ReflectTester().copy(customer);
  System.out.println("Copy information:" + customerCopy.getId() + " "
    + customerCopy.getName() + " " + customerCopy.getAge());
 }
}

package com.fahon.mytest;
class Customer {
 private Long id;
 private String name;
 private int age;
 public Customer() {
 }
 public Customer(String name, int age) {
  this.name = name;
  this.age = age;
 }
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
}

Class:com.fahon.mytest.Customer
id:1
name:Shmilyzl
age:25
Copy information:1 Shmilyzl 25
				
时间: 2024-11-09 03:30:53

反射 黑马程序员的相关文章

黑马程序员——高新技术---反射

黑马程序员——高新技术---反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射把Java类中的各种成分映射成相应的Java类,例如一个Java类中用一个Class类的对象表示,一个类中的组成部分:成员变量,方法,构造方

黑马程序员_Java反射机制

一切的操作都将使用Object完成,类,数组的引用都可以使用Object来接收 1,认识Class类 以前要是想知道一个类中的属性,成员变量,方法等等的信息的话,需要通过new这个类的对象才能得到这些信息,但是在Java中,也允许一个实例化对象找到一个类的完整的信息,这个类就是Class类,Class类是继承Object类的. 正常方式:  引入需要的"包.类"名称 >取得实例化对象 反射方式:  实例化对象>得到完整的"包.类"名称 getClass(

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员_高新技术_1_Java反射

------- android培训.java培训.期待与您交流! ---------- 0.反射知识体系 下图为反射整体的知识体系,把握住此图也就全局上掌握住反射所有内容. 1.反射概论 1)反射概念 其实字面上可以这么理解反射,平时使用类时都是由类new出对象,而反射则是通过对象"反射"出类的信息,好比一个人照镜子可以看到人类的特征,而看出机制就是镜子反射. 2)Java对象两种类型 Java程序中的许多对象在运行时会出现两种类型:编译时类型和运行时类型.如下代码: Person p

黑马程序员------Java反射学习总结(一)

-------------------------Java培训.Android培训,期待与您交流!----------------------------- 一.反射的概念 1) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2)一句话来讲,反射就是将Java类中的各个成分映射成相应的Java类. 3)即在Java中,描述事物的各种

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点

黑马程序员——【Java高新技术】——代理

一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理等等,如何去做? 解答:编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码. 2.代理原理图,如下: 3.代理的优点 如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类.还是代理类,这样以后很容易切换.例如,想要日志功能时就

黑马程序员_Java基础加强(下)

8.注解类 注解相当于一种标记,加了注解就等于打上了某种标记,没加就等于没打特殊标记,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记就去干什么事,标记可以加在包.类.字段.方法,方法的参数以及局部变量上. 注解的应用结构图: 为注解增加属性 定义基本类型的属性和应用属性 在注解类中增加String color(); @MyAnnotation(color = "red") 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法 MyAnno

黑马程序员_Java基础加强(上)

1.静态导入 静态导入是jdk1.5版本以后出现的新特性,一般是指导入静态方法,如:import static java.lang.System.out 是指导入系统输出的静态方法. 例: import static java.lang.System.out //导入java.lang包下的System类的静态方法out public class StaticImport { public static void main(String[] args) { int x=1; x++; out.p