java反射介绍及代码
反射
获取反射
//第一种获取方式,主要是获取信息
Class clazz =Class.forName("包名.类名");
//第二种获取方式,用来传递参数
Class clabb=类名.class;
//第三种获取方式,不推荐使用
Cat cat =new Cat();
Class clacc=cat.getClass();
获取的反射类型
- Field 获取的是变量
- Method[]获取的方法
- Constructor[]获取的是构造器
public 类型 的变量、方法、构造器获取
变量
1.关于获取全局变量
类对象名称.getFields(); // Field[]数组进行接收 只能获取由public修饰的变量
类对象名称.getDeclaredFields(); // Field[]数组进行接收 能获取所有的变量
类对象名称.getField(“指定的变量”) // Field 进行接收 只能获取由public修饰的变量
类对象名称.getDeclaredField(“指定的变量”); // Field数组进行接收 能获取所有的变量
2.Field成员变量的基本操作
1.设置值 set(Object obj,Object value)
①:new出我们的对象 :我们需要给赋的值内存空间进行表达
②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
②:调用set()方法,传递两个参数,第一个我们new出来的对象,第二个使我们想要付的值
2.获取值 get(Object obj)
①:new出我们的对象:我们需要给赋的值内存空间进行表达
②:判断我们所获取的变量是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:调用get()方法并且将创建出来的对象当成参数进行传递,用Object来进行返回值的接收
Class c1=Class.forName("包名.Dog");
//获取public值
Field f1=c1.getField("age");
Dog dog=new Dog();//创建对象
Object o=f1.get(dog);
System.out.println(o);
//获取private值
Field f2=c1.getDeclaredField("name");
f2.setAccessible(true);
Object o2=f2.get(dog);
System.out.println(o2);
//获取所有public变量
Field[] f4=c1.getFields();
for(Field field:f4) {
System.out.println(field);
}
//获取所有的变量 包括private
Field[] f4=c1.getDeclaredFields();
for(Field field:f4) {
System.out.println(field);
}
//设置private值
Field f3=c1.getDeclaredField("sex");
f3.setAccessible(true);//设置private的值需要这一步骤获得允许
f3.set(dog, '女');
Object o3=f3.get(dog);
System.out.println(o3);
//设置public值
Field f4=c1.getDeclaredField("age");
f4.set(dog, 12);
Object o3=f4.get(dog);
System.out.println(o3);
方法
1.关于获取方法
类对象名称.getMethods(); //Method[]数组进行接收 只能获取由public修饰的方法
类对象名称.getDeclaredMethods(); //Method[]数组进行接收 获取由所有的的方法
类对象名称.getMethod(“制定的方法名称”,参数类型.class…); //Method进行接收 只能获取由public修饰的方法
类对象名称.getDeclaredMethod(“制定的方法名称”,参数类型.class …); //Method数组进行接收 获取由所有的的方法
2.关于对方法的操作 invoke() //对方法的执行
①:new出我们的对象 :我们需要给方法内存空间进行表达
②:判断我们所获取的方法是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
②:调用invkoe()方法,传递两个参数,第一个我们new出来的对象,第二个使我们想要付的值
//获取public方法,用invoke()方法调用
Method m1=c1.getMethod("run");
System.out.println(m1);
m1.invoke(dog);
//获取private类型方法,用invoke()调用,带参方法的获取调用如下
Method m2=c1.getDeclaredMethod("eat",String.class);
m2.setAccessible(true);
m2.invoke(dog, "小明");
//获取所有的方法,包括private
Method[] m3=c1.getDeclaredMethods();
for(Method m:m3) {
System.out.println(m);
}
//获取所有public方法
Method[] m3=c1.getMethods();
for(Method m:m3) {
System.out.println(m);
}
构造器
三、关于构造器
类对象名称.getConstructors(); // Constructor[]数组进行接收 只能获取由public修饰的构造器
类对象名称.getDeclaredConstructors(); // Constructor[]数组进行接收 能获取所有的构造器
类对象名称.getConstructor(参数类型.class) //
类对象名称.getDeclaredConstructor(参数类型.class);
- 使用newInstance()进行初始化赋值
//获取所有public构造器
Constructor[] s1=c1.getConstructors();
for(Constructor s:s1) {
System.out.println(s);
}
//获取所有构造器,包括private
Constructor[] s2=c1.getDeclaredConstructors();
for(Constructor s:s2) {
System.out.println(s);
}
//获取带参数public构造器并赋值
Constructor s3=c1.getConstructor(Integer.class);
Object o4=s3.newInstance(12);
System.out.println(o4);
//获取带参数private构造器并赋值
Constructor s4=c1.getDeclaredConstructor(Integer.class,String.class);
s4.setAccessible(true);
Object o5=s4.newInstance(11,"小绿");
System.out.println(o5);