能分析类信息的能力叫做反射。
二、反射是如何工作的 三、如何获取class对象四、 class对象的功能
class类
public class Dog { private Integer age = 18; public String name = "大雄"; protected Character sex = '男'; String eat = "站着吃"; public void run() { System.out.println("大雄跑的很快"); } public void eat() { System.out.println("大雄吃的很多"); } private void flog(String name) { System.out.println(name + "会飞"); } public Dog() { } private Dog(int age, String name, char sex) { this.name = name; this.age = age; this.sex = sex; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Character getSex() { return sex; } public void setSex(Character sex) { this.sex = sex; } @Override public String toString() { return "Dog{" + "age=" + age + ", name='" + name + ''' + ", sex=" + sex + '}'; } }一、关于全局变量
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来进行返回值的接收
import java.lang.reflect.Field; public class Test2 { public static void main(String[] args) throws Exception { // class.forName("全类名") Class class1 = Class.forName("com.qcby.Fs.Dog"); // 变量 Field[] fields = class1.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println("---------------------------------"); Field[] fields1 = class1.getDeclaredFields(); for (Field field : fields1) { System.out.println(field); } System.out.println("---------------------------------"); Field fieldName = class1.getField("name"); System.out.println(fieldName); Dog dog = new Dog(); fieldName.set(dog, "大雄"); Object o = fieldName.get(dog); System.out.println(o); System.out.println("---------------------------------"); Field fieldAge = class1.getDeclaredField("age"); System.out.println(fieldAge); Dog dog1 = new Dog(); fieldAge.setAccessible(true);//暴力反射 fieldAge.set(dog1, 20); Object o1 = fieldAge.get(dog1); System.out.println(o1); } }
二、关于方法
1.关于获取方法
类对象名称.getMethods() Method[]数组进行接收 只能获取由public修饰的方法
类对象名称.getDeclaredMethods() Method[]数组进行接收 获取所有的方法
类对象名称.getMethod("指定方法名称",参数类型.class……) Method进行接收 只能获取由public修饰的指定方法
类对象名称.getDeclaredMethod("指定方法名称",参数类型.class……) Method进行接收 获取到指定的方法(所有方法中)
2.关于对方法 *** 作 invcke() //对方法的执行
①:new出我们对象:我们需给赋的值内存空间进行表达
②:判断我们所获取的方法是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:调用invcke()方法,传递两个参数,第一个是我们new出的对象,第二个是我们想要赋的值
import java.lang.reflect.Method; public class Test2 { public static void main(String[] args) throws Exception { // class.forName("全类名") Class class1 = Class.forName("com.qcby.Fs.Dog"); // 方法 Method[] m1 = class1.getMethods(); for (Method method : m1) { System.out.println(method); } System.out.println("---------------------------------------"); Method[] m2 = class1.getDeclaredMethods(); for (Method method : m2) { System.out.println(method); } Dog dog = new Dog(); Method Mdog = class1.getMethod("run"); Mdog.invoke(dog); Dog dog2 = new Dog(); Method Mdog2 = class1.getDeclaredMethod("flog", String.class); Mdog2.setAccessible(true);//暴力反射 Mdog2.invoke(dog2, "张二麻子"); } }三、关于构造器
1.关于获取构造器
类对象名称.getConstructors() Constructor[]数组进行接收 只能获取由public修饰的构造器
类对象名称.getDeclaredConstructors() Constructor[]数组进行接收 获取所有的构造器
类对象名称.getConstructor(参数类型.class ...) Constructor进行接收 只能获取由public修饰的指定构造器
类对象名称.getDeclaredConstructor(参数类型.class ...) Constructor进行接收 获取到指定的构造器(所有构造器中)
2.关于对构造器 *** 作 newInstance(参数值.....) 创建对象
①:new出我们对象:我们需给赋的值内存空间进行表达
②:判断我们所获取的构造器是不是private类型的,如果是必须使用暴力反射 : setAccessible(true);
③:newInstance(参数值.....),传递参数,我们想要赋的值
import java.lang.reflect.Constructor; public class Test2 { public static void main(String[] args) throws Exception { // class.forName("全类名") Class class1 = Class.forName("com.qcby.Fs.Dog"); // 构造器 Constructor[] C1 = class1.getConstructors(); for (Constructor constructor : C1) { System.out.println(constructor); } Constructor[] C2 = class1.getDeclaredConstructors(); for (Constructor constructor : C2) { System.out.println(constructor); } Constructor C3 = class1.getConstructor(); Object o = C3.newInstance(); System.out.println(o); Constructor C4 = class1.getDeclaredConstructor(int.class, String.class, char.class); C4.setAccessible(true);//暴力反射 Object o1 = C4.newInstance(12, "小卡", '女'); System.out.println(o1); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)