反射:
1、可以在程序运行过程中,操作这些对象。
2、可以解耦,提高程序的可扩展性。
反射类:
package zhujie;
public class cau {
public int a;
public double b;
private String c;
@Override
public String toString() {
return "cau{" +
"a=" + a +
", b=" + b +
", c='" + c + '\'' +
'}';
}
public cau(int a,double b,String c){
this.a=a;
this.b=b;
this.c=c;
}
public cau(){}
private cau(int a){}
public void add(int a,int b){
System.out.println(a + b);
}
private void max(){
System.out.println(1 * 2);
}
public void min(){
System.out.println(1 / 0);
}
}
获取Class对象的方式:
1、Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象。
多用于配置文件,将类名定义在配置文件中。读取文件,加载类。
2、类名.class:通过类名的属性class获取
多用于参数的传递。
3、对象.getClass():getClass()方法在Object类中定义。
多用于对象的获取字节码的方式。
结论:同一个字节码文件(*.class)在一次文件运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
public void reflect() throws Exception {
//Class.forName(“全类名”)
Class aClass1 = Class.forName("zhujie.cau");
System.out.println(aClass1);
//类名.class
Class cauClass = cau.class;
System.out.println(cauClass);
//对象.getClass()
cau cau = new cau();
Class aClass = cau.getClass();
System.out.println(aClass);
System.out.println(cauClass == cauClass);
System.out.println(aClass1 == cauClass);
}
Class对象功能:
1、获取成员变量们
Field[] getFields():获取所有公有的成员变量
Field getField(String name):获取公有的指定成员变量
Filed[] getDeclaredFields():获取所有的成员变量(包括私有)
Field getDeclaredFields(String name):获取指定成员变量(包括私有)
Field[] fields = aClass.getDeclaredFields();
Field a = aClass.getField("a");
2、获取的构造方法们
Constructor<?>[] getConstructors():获取所有公有的构造函数
Constructor<T> getConstructor(类<?>...parameterTypes(参数类型)):获取公有的指定构造函数
Constructor<?>[] getDeclaredConstructors():获取所有的构造函数(包括私有)
Constructor<T> getDeclaredConstructor(parameterTypes):获取指定构造函数(包括私有)
Constructor[] constructors = aClass.getConstructors();
System.out.println(constructors);
Constructor constructor = aClass.getConstructor(int.class, double.class, String.class);
System.out.println(constructor);
3、获取成员方法
Method[] getMethods():获取所有公有的成员方法
Method getMethod(String name,类<?>... parameterTypes):获取公有的指定成员方法
Method[] getDeclaredMethods():获取所有的成员方法(包括私有)
Method getDeclaredMethod(String name,类<?>... parameterTypes):获取指定成员方法(包括私有)
Method method=aClass.getMethod("add",int.class,int.class);
Method[] methods = aClass.getMethods();
methods[0].invoke(cau,1,2);
System.out.println(method.getName());
4、获取类名
String getName()
Field:成员变量
1、设置值
void set(Object obj,Object value)(类的对象,修改值)
2、获取值
Object get(Object obj)(对象)
3、忽略访问权限修饰符的安全检查(当通过set或者get获取或者修改pirvate的值时,会报错)
setAccessible(true):暴力反射
a.set(cau,3);
//fields[2]为private变量
System.out.println(fields[2].isAccessible());
fields[2].setAccessible(true);
fields[2].set(cau,"fd");
System.out.println(fields[2].get(cau));
Constructor:构造方法
1、创建对象
T newInstance(Object... initargs)(参数)
如果使用空参数构造方法创建对象,操作可以简化:Class.newInstance();
Object o1 = aClass.newInstance();
Object o = constructor.newInstance(1,2,"ewr");
System.out.println(o);
System.out.println(o1);
Method:方法对象
1、执行方法
Object invoke(Object obj, Object... args)(类的对象,参数)
2、获取方法名称
String getName()