通过Class对象 获取成员变量
package cn.itcast.test;
import cn.itcast.Junit.add;
import java.lang.reflect.Field;
/*
*
*/
public class deme01 {
public static void main(String[] args) throws Exception {
Class<add> addClass = add.class;//获取类的class对象 1
add add = new add();
// 获取成员变量时 成员变量必须被public修饰 否则获取不到
Field[] fields = addClass.getFields();//获取class对象中所有的成员变量存到Field类型的数组当中 2
Field age = addClass.getField("name");//从class对象中获取指定名字的成员变量 3
System.out.println(age.get(add));//打印指定名称的变量 get方法需要传入new出来的类对象//null 4
for (Field field : fields) {//遍历所有的成员变量
System.out.println(field.get(add));//打印出来//null 0
}
age.set(add, "单高阳");//设置变量 传入类对象 设置参数 5
System.out.println(age.get(add));//打印指定名称的变量 get方法需要传入new出来的类对象 不能是匿名对象
System.out.println("=================================================");
Field[] declaredFields = addClass.getDeclaredFields(); //获取所有成员变量无视public 6
for (Field declaredField : declaredFields) {//遍历所有变量 需添加暴力反射
declaredField.setAccessible(true);//暴力反射 忽略访问安全修饰符的权限直接全部获取!! 7
System.out.println(declaredField.get(add));//打印结果
}
Field age1 = addClass.getDeclaredField("age");//获取指定名称的变量 须添加暴力反射 8
age1.setAccessible(true);//暴力反射 忽略访问安全修饰符的权限直接全部获取!!
System.out.println(age1.get(add));
}
}
通过Class对象获取构造方法
package cn.itcast.test;
import cn.itcast.Junit.add;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
/*
*
*/
public class deme01 {
public static void main(String[] args) throws Exception {
Class<add> addClass = add.class;//获取类的class对象 1
Constructor<?>[] constructors = addClass.getConstructors();//获取class对象的所有的构造方法存储到构造器数组当中
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
Constructor<add> constructor = addClass.getConstructor(String.class, int.class);//传入指定参数获取对应的构造器
System.out.println(constructor);
Constructor<add> constructor2 = addClass.getConstructor(String.class);//传入指定参数获取对应的构造器
System.out.println(constructor2);
Constructor<add> constructor1 = addClass.getConstructor();//传入指定参数获取对应的构造器
System.out.println(constructor1);
add sss = constructor.newInstance("sss", 546);//根据构造器传入指定参数查看参数列表相符的构造方法并返回此对象
System.out.println(sss);
add add = constructor1.newInstance();//根据构造器传入指定参数查看参数列表相符的构造方法并返回此对象 空参构造
System.out.println(add);
cn.itcast.Junit.add add2 = addClass.newInstance();//根据Class对象快速获取无参构造不必再创建构造器
System.out.println(add2);
}
}
通过Class对象获取方法
package cn.itcast.test;
import cn.itcast.Junit.add;
import java.lang.reflect.Method;
public class deme01 {
public static void main(String[] args) throws Exception {
Class<add> addClass = add.class;//获取类的class对象
add add = new add();//创建对象
// 1
Method method = addClass.getMethod("method");//通过Class中的getMetod方法传入方法名和参数列表返回Method类型的对象
method.invoke(add);//Method类中的运行方法 运行指定对象里面本类方法名称以及参数列表对应的方法
Method method1 = addClass.getMethod("method", int.class);//通过Class中的getMetod方法传入方法名和参数列表的Class对象返回Method类型的对象
method1.invoke(add,50);//Method类中的运行方法 运行指定对象里面本类方法名称以及参数列表对应的方法
Method[] methods = addClass.getMethods();//获取所有方法返回一个Method类型的数组
for (Method method2 : methods) {
System.out.println(method2.getName());//打印所有方法名称 包括继承的Object类中的方法
}
String name = addClass.getName();//获取Class对象对应的类名称
System.out.println(name);
}
}