Java反射
Java获取反射的三种方式
- Java 中的反射首先是能够获取到 Java 中要反射类的字节码 。
-
通过new对象实现反射机制
//方式一(通过建立对象) Student student = new Student(); Class classobj1 = student.getClass(); System.out.println(classobj1.getName());
-
通过路径实现反射机制
//方式二(所在通过路径-相对路径) Class classobj1 = Class.forName("com.base.Student"); System.out.println(classobj1.getName());
-
通过类名实现反射机制
//方式三(通过类名) Class classobj1 = Student.class; System.out.println(classobj1.getName());
Java反射机制
-
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。
-
Class
类与java.lang.reflect
类库一起对反射的概念进行了支持,该类库包括了Field
,Method
,Constructor
类 (每个类都实现了Member
接口)。这些类型的对象时由 JVM 在运行时创建的,用以表示未知类里对应的成员。这样你就可以使用Constructor
通过newInstance()
创建新的对象,用invoke()
方法调用与Method对象关联的方法。另外,还可以调用getFields()
getMethod()
和getConstructor()
等很便利的方法,以返回表示字段,方法,以及构造器的对象的数组。这样匿名对象的信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。package com.base.entity; public class Student { public String name; public int age; private String mobile; public Student() { System.out.println("无参构造函数被调用"); } public Student(String type) { System.out.println("有参构造函数被调用 +" + type); } public void study(){ System.out.println("study无参方法被调用"); } public void study(String type){ System.out.println("study有参方法被调用 + " + type); } } /****************************************************/ package com.base.reflect; import com.base.entity.Student; import java.lang.reflect.Constructor; public class ReflectTest { public static void main(String[] args) throws Exception { Class aClass = Class.forName("com.base.entity.Student"); //无参初始化 Constructor<Student> constructors = aClass.getConstructor(); Student student = constructors.newInstance(); //有参初始化 Constructor<Student> constructors1 = aClass.getConstructor(String.class); Student student1 = constructors1.newInstance("哈哈哈"); //方法调用 //有参方法调用 Method study = aClass.getMethod("study", String.class); study.invoke(student,"我是好人"); //无参方法调用 Method study1 = aClass.getMethod("study"); study1.invoke(student); //获取类的属性,无法获取私有化的属性 Field[] fields = aClass.getFields(); System.out.println("获取到Student类的属性"); for (Field field : fields) { System.out.print(" " + field.getName()); } //获取类的私有属性 Field mobile = aClass.getDeclaredField("mobile"); mobile.setAccessible(true); Object o = mobile.get(student); System.out.println(o); mobile.set(student,"key"); Object o1 = mobile.get(student); System.out.println(o1); } }
reflect类库
-
Constructor
:构造器class.getConstructor(Class<?>... parameterTypes);//获取该类下非私有构造器(根据parameterTypes参数类型返回) class.getConstructors();//获取该类非私有的所有构造器 class.getDeclaredConstructor(Class<?>... parameterTypes);//获取该类下构造器(根据parameterTypes参数类型返回) class.getDeclaredConstructors();//获取该类的所有构造器 //初始化 constructor.newInstance(Object ... initargs);//有参数的构造器需要传入对应类型的initargs
-
Method
:方法class.getMethod(String name, Class<?>... parameterTypes);//获取该类下非私有的name方法,(根据parameterTypes参数类型返回) class.getMethods();//获取该类下的所有非私有方法 class.getDeclaredMethod(String name, Class<?>... parameterTypes);//获取该类下的name方法(根据parameterTypes参数类型返回) class.getDeclaredMethods();//获取该类下的所有方法 //调用方法 method.invoke(Object obj);//参数为此类的实体对象
-
Filed
:属性aClass.getField(String name);//获取该类下非私有的name属性。 aClass.getFields();//获取该类下非私有的所有属性 aClass.getDeclaredField(String name);//获取该类下的name属性 aClass.getDeclaredFields();//获取该类下的所有属性 //get/set filed.get(Object obj);//获取参数的值,参数为此类的实例化对象 filed.set(Object obj, Object value)//设置参数的值为value
-
注意:
-
此上所有通过Declared获取到的私有构造器、方法、属性调用时需先
setAccessible(true)
设置为可访问 -
静态方法与静态属性的实体对象可以不用传递。(如
method.invoke(null);
,filed.get(null);
)
-