1、 什么是反射机制
正常情况下,我们通过类来创建对象。如果反过来,我们要通过一个对象来找到对应的类,怎么办,这时就要用到反射机制。
2、 java.lang.Class类
a) Java中Object是所有类的父类,而Object类是java.lang.Class类的一个实例化对象,所以所有的类都是java.lang.Class类的实例化对象,java.lang.Class类是非常特殊的一个类,它是描述类的类
b) java.lang.Class类的实例化对象(各个类)描述了各个类本身的整个结构,这也是反射机制的基础
c) 记住,所有类都是java.lang.Class类的对象
获取类名和类对象,如下
import java.util.Properties;
publicclass hello{
publicstaticvoid main(String args[])throws Exception{
Properties ps =new Properties();
//获取类名
System.out.println(ps.getClass().getName());
//类对象的三种获取方式
Class c1 = Class.forName("java.util.Properties");
Class c2 =new Properties().getClass();
Class c3 = Properties.class;
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
}
}
3、 java.lang.Class类的使用
a) Class对象来创建对象
b) 获取类结构,要获取类结构需要引用java.lang.reflect包,包括Constructor构造函数、Method方法、Field属性等
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
class Person{
public String name;
public Person(){}
public Person(String name){this.name = name;}
}
publicclass hello{
publicstaticvoid main(String args[])throws Exception{
//创建Class类的Person类对象
Class c1 = Class.forName("Person");
//使用newInstanctce()方法来实例化Person类,此处调用的是无参构造函数
Person p =(Person)c1.newInstance();
p.name ="kaka";
System.out.println(p.name);
//获取Person类的构造函数列表
Constructor cs[]= c1.getConstructors();
for(Constructor c : cs){
System.out.println(c);
}
//获取Person类的函数列表
Method ms[]= c1.getMethods();
for(Method m : ms){
System.out.println(m);
}
}
}
4、 通过反射调用类中方法与属性等,invoke()
import java.lang.reflect.Method;
import java.lang.reflect.Field;
class Person{
private String name;
publicint age;
public Person(){}
public String getName(){returnthis.name;}
publicvoid setName(String name){this.name = name;}
}
publicclass hello{
publicstaticvoid main(String args[])throws Exception{
//通过类名获取Person类对象
//注意:使用Class>泛型,否则报不安全错误
Class> c1 = Class.forName("Person");
//获取Person的实例化对象
Object obj = c1.newInstance();
//获取Person类中的setName方法,该方法带一个String参数
Method m1 = c1.getMethod("setName", String.class);
//调用setName方法,需传入Person实例化对象,和参数
m1.invoke(obj,"kaka");
//获取Person类中的getName方法,该方法不带参数
Method m2 = c1.getMethod("getName");
//输出返回值
System.out.println((String)m2.invoke(obj));
//通过反射操作属性
Field f1 = c1.getDeclaredField("age");
f1.set(obj,100);
System.out.println(f1.get(obj));
}
}
5、 动态代理,没看懂,需要时再看吧