Java反射——反射获取类的结构信息——第四章

Java反射——反射机制问题——第一章
Java反射——Class类——第二章
Java反射——类加载——第三章
Java反射——反射获取类的结构信息——第四章

文章目录

  • 1:通过反射获取类的结构信息
    • 1.1 java.lang.Class类
    • 1.2 java.lang.reflect.Field类
    • 1.3 java.lang.reflect.Method类
    • 1.4 java.lang.reflect.Constructor类
  • 5:反射爆破创建实例

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'}

你可能感兴趣的:(Java反射,反射,java)