
本文共 7416 字,大约阅读时间需要 24 分钟。
文章目录
1:通过反射获取类的结构信息
1.1 java.lang.Class类
-
getName:获取全类名
-
getSimpleName:获取简单类名
-
getFields:获取所有public修饰的属性,包含本类以及父类的
-
getDeclaredFields:获取本类中所有属性
-
getMethods:获取所有public修饰的方法,包含本类以及父类的
-
getDeclaredMethods:获取本类中所有方法
-
getConstructors:获取所有public修饰的构造器,包含本类
-
getDeclaredConstructors:获取本类中所有构造器
-
getPackage:以Package形式返回包信息
-
getSuperClass:以Class形式返回父类信息
-
getInterfaces:以Class[]形式返回接口信息
-
getAnnotations:以Annotation形式返回注解信息
对如上12个点,进行代码演示
public class ReflectiionUtils { public static void main(String[] args) { } @Test //第一组方法api public void api_01() throws Exception { //获取class对象 Class personcls = Class.forName("com.reflection.Person"); Object o = personcls.newInstance();// 1. getName:获取全类名 System.out.println("全类名:"+personcls.getName());// 2. getSimpleName:获取简单类名 System.out.println("简单类名:"+personcls.getSimpleName());// 3. getFields:获取所有public修饰的属性,包含本类以及父类的 Field[] fields = personcls.getFields(); for (Field fields1:fields){ System.out.println("获取所有public修饰的属性"+fields1.getName()); }// 4. getDeclaredFields:获取本类中所有属性 Field[] fieldss = personcls.getDeclaredFields(); for (Field fields1:fieldss){ System.out.println("获取本类中所有属性"+fields1.getName()); }// 5. getMethods:获取所有public修饰的方法,包含本类以及父类的 Method[] methods = personcls.getMethods(); for (Method methods1:methods){ System.out.println("获取所有public修饰的方法,包含本类以及父类的"+methods1.getName()); }// 6. getDeclaredMethods:获取本类中所有方法// 7. getConstructors:获取所有public修饰的构造器,包含本类以及父类的 Constructor [] constructors = personcls.getConstructors(); for (Constructor constructor:constructors){ System.out.println("取所有public修饰的构造器,包含本类以及父类的:"+constructor); }// 8. getDeclaredConstructors:获取本类中所有构造器// 9. getPackage:以Package形式返回包信息 System.out.println("以Package形式返回包信息:"+personcls.getPackage());// 10. getSuperClass:以Class形式返回父类信息 System.out.println("以Class形式返回父类信息:"+personcls.getSuperclass());// 11. getInterfaces:以Class[]形式返回接口信息 System.out.println("以Class[]形式返回接口信息:"+personcls.getInterfaces());// 12. getAnnotations:以Annotation形式返回注解信息 }}class A{ public String names; public void m4(){ } private void m5(){ }}interface B{ }class Person extends A implements B{ //属性 public String name; protected int age; String job; private double sal; //方法 public void m1(){ } public void m2(){ } public void m3(){ } public Person(){ }}
1.2 java.lang.reflect.Field类
- getModifiers:以int形式返回修饰符
[说明:默认修饰符是0,public 是1 , private是2 , protected是4,static是8 , final 是16], public(1) + static (8) = 9
-
getType:以Class形式返回类型
-
getName:返回属性名
对如上3个点,进行代码演示
@Test //第二组方法api java.lang.reflect.Field类 public void api_02() throws Exception { //获取class对象 //1.以int形式返回修饰符 Class personcls = Class.forName("com.reflection.Person"); Field[] fields = personcls.getDeclaredFields(); for (Field field:fields){ System.out.println("本类中所有属性:"+field.getName()+",以int形式返回修饰符:"+field.getModifiers()+",以Class形式返回类型:"+field.getType()); } } class Person { //属性 public String name; protected int age; String job; private double sal;}
本类中所有属性:name,以int形式返回修饰符:1,以Class形式返回类型:class java.lang.String本类中所有属性:age,以int形式返回修饰符:4,以Class形式返回类型:int本类中所有属性:job,以int形式返回修饰符:0,以Class形式返回类型:class java.lang.String本类中所有属性:sal,以int形式返回修饰符:2,以Class形式返回类型:double
1.3 java.lang.reflect.Method类
- getModifiers:以int形式返回修饰符
[说明:默认修饰符是0 , public 是1,private是2 , protected是4,static是8,final 是16]
-
getReturnType:以Class形式获取返回类型
-
getName:返回方法名
-
getParameterTypes:以Class[]返回参数类型数组
对如上4个点,进行代码演示
@Test //第三组方法api java.lang.reflect.Field类 public void api_03() throws Exception { //获取class对象 //1.以int形式返回修饰符 Class personcls = Class.forName("com.reflection.Person"); Method[] methods = personcls.getDeclaredMethods(); for (Method method:methods){ System.out.println("本类中所有方法名:"+method.getName()+",以int形式返回修饰符:"+method.getModifiers()+",以Class形式获取返回类型:"+method.getReturnType()); Class [] parameterType = method.getParameterTypes(); for (Class parameterTypes:parameterType ){ System.out.println("以Class[]返回参数类型数组:"+parameterTypes); } } }
class Person { //方法 public void m1(int m1,float m2){ } public void m2(){ } public void m3(){ }}
本类中所有方法名:m1,以int形式返回修饰符:1,以Class形式获取返回类型:void以Class[]返回参数类型数组:int以Class[]返回参数类型数组:float本类中所有方法名:m2,以int形式返回修饰符:1,以Class形式获取返回类型:void本类中所有方法名:m3,以int形式返回修饰符:1,以Class形式获取返回类型:void
1.4 java.lang.reflect.Constructor类
-
getModifiers:以in形式返回修饰符
-
getName:返回构造器名(全类名)
-
getParameterTypes:以Class[]返回参数类型数组
对如上3个点,进行代码演示
@Test //第四组方法api java.lang.reflect.Constructor类 public void api_04() throws Exception { //获取Constructor对象 //1.以int形式返回修饰符 Class personcls = Class.forName("com.reflection.Person"); Constructor[] methods = personcls.getDeclaredConstructors(); for (Constructor method:methods){ System.out.println("本类中所有构造器名:"+method.getName()+",以int形式返回修饰符:"+method.getModifiers()); Class [] parameterType = method.getParameterTypes(); for (Class parameterTypes:parameterType ){ System.out.println("以Class[]返回参数类型数组:"+parameterTypes); } } } class Person{ //构造器 public Person(int m1,float m2){ } public Person(double m1,char m2){ }}
本类中所有构造器名:com.reflection.Person,以int形式返回修饰符:1以Class[]返回参数类型数组:double以Class[]返回参数类型数组:char本类中所有构造器名:com.reflection.Person,以int形式返回修饰符:1以Class[]返回参数类型数组:int以Class[]返回参数类型数组:float
5:反射爆破创建实例
通过反射创建对象
-
方式一: 调用类中的public修饰的无参构造器
-
方式二:调用类中的指定构造器
-
Class类相关方法
newlnstance :调用类中的无参构造器,获取对应类的对象
getConstructor(Class…clazz):根据参数列表,获取对应的public构造器对象getDecalaredConstructor(Class…clazz):根据参数列表,获取对应的构造器对象
- Constructor类相关方法
setAccessible:暴破(暴力破解,使用反射可以访问private构造器/方法/属性,反射面前都是纸老虎)
newlnstance(Object…obj):调用构造器
测试1:通过反射创建某类的对象,要求该类中必须有public的无参构造
测试2:通过调用某个特定构造器的方式,实现创建某类的对象public class ReflectCreateInstance { public static void main(String[] args) throws Exception { //1.调用类中的public修饰的无参构造器 Class cls = Class.forName("com.reflection.Persons"); Object o = cls.newInstance(); System.out.println(o); //2.通过public的有参构造器创建实例 Constructor constructor = cls.getConstructor(int.class, String.class); Object zzz = constructor.newInstance(20, "zzz"); System.out.println(zzz); //3.通过非public的有参构造器创建实例 Constructor constructors = cls.getDeclaredConstructor(int.class); constructors.setAccessible(true); Object z = constructors.newInstance(60); System.out.println(z); }}class Persons{ private int age=10; private String name="zlj"; public Persons(){ } public Persons(int age,String name){ this.age=age; this.name=name; } private Persons(int age){ this.age=age; this.name=name; } @Override public String toString() { return "Persons{" + "age=" + age + ", name='" + name + '\'' + '}'; }}
Persons{age=10, name='zlj'}Persons{age=20, name='zzz'}Persons{age=60, name='zlj'}
发表评论
最新留言
关于作者
