Java反射——反射获取类的结构信息——第四章
发布日期:2021-05-07 02:38:48 浏览次数:23 分类:精选文章

本文共 7416 字,大约阅读时间需要 24 分钟。

文章目录

1:通过反射获取类的结构信息

1.1 java.lang.Class类

  1. getName:获取全类名

  2. getSimpleName:获取简单类名

  3. getFields:获取所有public修饰的属性,包含本类以及父类的

  4. getDeclaredFields:获取本类中所有属性

  5. getMethods:获取所有public修饰的方法,包含本类以及父类的

  6. getDeclaredMethods:获取本类中所有方法

  7. getConstructors:获取所有public修饰的构造器,包含本类

  8. getDeclaredConstructors:获取本类中所有构造器

  9. getPackage:以Package形式返回包信息

  10. getSuperClass:以Class形式返回父类信息

  11. getInterfaces:以Class[]形式返回接口信息

  12. 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类

  1. getModifiers:以int形式返回修饰符

[说明:默认修饰符是0,public 是1 , private是2 , protected是4,static是8 , final 是16], public(1) + static (8) = 9

  1. getType:以Class形式返回类型

  2. 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类

  1. getModifiers:以int形式返回修饰符

[说明:默认修饰符是0 , public 是1,private是2 , protected是4,static是8,final 是16]

  1. getReturnType:以Class形式获取返回类型

  2. getName:返回方法名

  3. 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类

  1. getModifiers:以in形式返回修饰符

  2. getName:返回构造器名(全类名)

  3. 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:反射爆破创建实例

通过反射创建对象

  1. 方式一: 调用类中的public修饰的无参构造器

  2. 方式二:调用类中的指定构造器

  3. Class类相关方法

newlnstance :调用类中的无参构造器,获取对应类的对象

getConstructor(Class…clazz):根据参数列表,获取对应的public构造器对象getDecalaredConstructor(Class…clazz):根据参数列表,获取对应的构造器对象

  1. 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'}
上一篇:为什么启动一个线程是start方法而不是run方法
下一篇:Java反射——类加载——第三章

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月01日 16时13分33秒