反射
反射:
一开始学习面向对象的时候就是new对象,调方法,而反射的话就是
定义一个学生类
public class Student { public static void main(String[] args) {} private String name; private int age; public Student() {} public Student(String name,int age) { this.name=name; this.age=age; } public void say() { System.out.println("说话"); } public void run(String somthing) { System.out.println("开始"+somthing); } }
通过Class.forName类加载器,对类的一个描述
String className="cs1.Student"; Class<?> forName = Class.forName(className); Object newInstance = forName.newInstance(); System.out.println(newInstance); System.out.println(new Student().toString()); //以上代码相当于new Student(); 输出如下,都是相同格式,包名加名加@地址 cs1.Student@7852e922 cs1.Student@4e25154f
1.getDeclaredMethods方法
String className="cs1.Student"; Class<?> forName = Class.forName(className); //getDeclaredMethods方法 Method[] declaredMethods = forName.getDeclaredMethods(); //上面的Method方法返回值是一个数组类型,可以是方法名,参数名,返回值,修饰符 for (Method method : declaredMethods) { //获取对应方法名 System.out.println(method.getName()); //方法参数个数 System.out.println(method.getParameterCount()); } //输出 main 1 run 0 say 0
2.getDeclaredFields方法和getFields方法
//可以通过getDeclaredFields方法来获取该类中的属性名 Field[] declaredFields = forName.getDeclaredFields(); for (Field field : declaredFields) { System.out.println(field.getName()); } //输出name age 若也想取出该类继承的父类的属性 //getFields方法取出来该类属性和继承的父类属性 Field[] fields = forName.getFields(); for (Field field : fields) { System.out.println(field.getName); } 该类继承父类Person有gender和score属性 //则输出 name age gender score
3.getConstructors方法输出无惨方法个数0和有参方法参数个数2
Constructor<?>[] constructors = forName.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor.getParameterCount()); } public Student() {} public Student(String name,int age) { this.name=name; this.age=age; } //如上就是Student类中有参方法和无参方法 //输出无参个数0和有参方法个数2
4.同时相当于类加载器的有三种方法
//1.class.forName Class<?> forName = Class.forName(className); //2.别人给了你一个new的对象 Student student = new Student(); Class<? extends Student> class1 = student.getClass(); //3.包名加类名加class Class<?> class2=cs1.Student.class;
注意:
Student student = new Student(); Student student2 = new Student(); Class class1 = student.getClass(); Class class2 = student2.getClass(); //以上Student和Student2是不相等的因为是new了两个对象,而class1和class2是相等的,因为都是对一个类的描述 System.out.println(student==student2); System.out.println(class1==class2); //所以输出false和true
5.getDeclaredField方法
//getDeclaredField方法获取到属性的类型 Field field = forName.getDeclaredField("name"); Type genericType = field.getGenericType(); System.out.println(genericType); //输出 class java.lang.String
6.getField方法,为属性名赋值
Class<?> forName = Class.forName(className); Object obj = forName.newInstance(); //为属性name赋值 Field name = forName.getDeclaredField("name"); name.set(obj,"lisi"); //为属性age赋值 Field age = forName.getDeclaredField("age"); age.set(obj,21); //这时候name值为lisi,age值为21
如下图,debug:
7.getMethod方法,为方法赋值
Class<?> forName = Class.forName(className); Object obj = forName.newInstance(); Method run = forName.getMethod("run", String.class); run.invoke(obj,"跑步"); //输出 开始跑步

浙公网安备 33010602011771号