反射(reflect)
什么是反射机制?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法,这种动态获取的以及动态调用对象的方法的功能称为java语言的反射机制,简单来说, 就可以把.class文件比做动物的尸体, 而反射技术就是对尸体的一种解剖。
作用:
通过反射技术, 我们可以拿到该字节码文件中所有的东西, 例如成员变量, 成员方法, 构造方法, 而且还包括私有。
字节码文件获取的三种方式:
-
Class c1=class.forName(包名+类名);
-
Class c2=new Peson().getClass();
-
Class c3=Person.class;
- 通过Class类创建对象和获取:
一,创建对象:
1.通过无参构造方法:
String className="cn.java.reflect.Person";
Class ob = Class.forName(className);
Person p = (Person)ob.newInstance();
2.通过有参构造方法创建对象:
tring className= "cn.java.reflect.Person";
Class ob = Class.forName(className);
Constructor[] cst = ob.getConstructors();
Person p =(Person)cst[0].newInstance("huairen");
二、获得:
1.取得类的结构:
String className= “cn.java.reflect.Person”;
Class ob = Class.forName(className);
2.取得全部实现的接口:
ob.getInterfaces Class[] inter = ob.getInterfaces();
for(int i=0;i<inter.length;i++){System.out.println(inter[i]);}
3.取得父类:
Class superClass = ob.getSuperclass();
System.out.println(superClass);
4.取得全部构造方法:
Constructor[] cs = ob.getConstructors();
for(int i=0;i<cs.length;i++){
System.out.println(cs[i]);
}
取出构造方法的形参:
for(int i=0;i<cs.length;i++){
Class[] pr =cs[i].getParameterTypes();
for(int j=0;j<pr.length;j++){
System.out.println(pr[j]);
}
}
取出构造方法的权限:
for(int i=0;i<cs.length;i++){
int md =cs[i].getModifiers();
System.out.println(Modifier.toString(md));
}//将数字1还原为public
取得构造方法名:
System.out.println(cs[0].getName());
5.取得全部方法:]
Method[] mthd = ob.getMethods();
获得方法的形参类型:
Class[] pa =mthd[i].getParameterTypes();
for(int j=0;j<pa.length;j++){
System.out.println(pa[j]);
}
获得方法名字:
String name = mthd[i].getName();
获得属性:
Field[] f = ob.getDeclaredFields();
6.通过反射调用类中的方法
没有参数的情况下:
Method mth = ob.getDeclaredMethod("say");
mth.invoke(ob.newInstance());
有参数的情况下:
Method mth = ob.getDeclaredMethod("say",String.class,int.class);
mth.invoke(ob.newInstance(),"张三",80);
7.修改属性:
Class<?> c =Class.forName("cn.java.reflect.Person");
Constructor<?>[] cst = c.getConstructors();
Person p = (Person) cst[1].newInstance("张三",3);
Field f =c.getDeclaredField("name");
f.setAccessible(true);
f.set(p, "wowo");
System.out.print(f.get(p));