反射

反射

反射概念

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

本片产考博客: https://zhuoqianmingyue.blog.csdn.net/article/details/85090982

反射作用

反射原理

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

反射的实现主要借助以下四个类:

  1. Class:类的对象
  2. Constructor:类的构造方法
  3. Field:类中的属性对象
  4. Method:类中的方法对象

反射的使用

获取class对象的方式

package com.xwtech.test.反射;

/**
 * 获取class对象的四种方式
 * @author Liyongzhe
 * @date 2020/12/14_10:02
 */
public class ClassCreatingMode  {
    /**
     * @param args
     * @throws ClassNotFoundException
     */
    public static void main(String[] args) throws ClassNotFoundException {

        //通过实例对象获取getClass方法
        ClassCreatingMode model = new ClassCreatingMode();
        Class<? extends ClassCreatingMode> class1 = model.getClass();
        System.out.println("实例对象getClass:"+class1);

        //通过类名.class方法
        Class<ClassCreatingMode> class2 = ClassCreatingMode.class;
        System.out.println("类名.class:"+class2);

        //通过Class对象的forName()静态方法获取
        Class<?> class3 = Class.forName("com.xwtech.test.反射.ClassCreatingMode");
        System.out.println("Class对象的forName()静态方法获取:"+class3);
    }

}

打印结果

实例对象getClass:class com.xwtech.test.反射.ClassCreatingMode
类名.class:class com.xwtech.test.反射.ClassCreatingMode
Class对象的forName()静态方法获取:class com.xwtech.test.反射.ClassCreatingMode

获取构造方法

package com.xwtech.test.反射.person;

/**
 * @author Liyongzhe
 * @date 2020/12/14_10:17
 */
public class Person {

    private String name;
    private Integer age;
    protected char sex;
    String address;
    public double salary;

    /**
     *  受保护的性别 构造方法
     * @param sex
     */
    protected Person(char sex) {
        this.sex = sex;
        System.out.println("protected Person(char sex)");
    }

    /**
     * 私有的 年龄 构造方法 
     * @param age
     */
    private Person(Integer age) {
        this.age = age;
        System.out.println("private Person(Integer age)");
    }

    /**
     * 默认的 姓名和年龄
     * @param name
     * @param age
     */
    Person(String name,Integer age) {
        this.name = name;
        this.age = age;
        System.out.println("Person(String name,Integer age)");
    }

    /**
     * 共有的 姓名 构造方法
     * @param name
     */
    public Person(String name) {
        this.name = name;
        System.out.println("public Person(String name)");
    }

    /**
     * 无参数构造方法 
     */
    public Person() {
        this.name = "default";
        System.out.println("public Person()");
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
package com.xwtech.test.反射.person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Parameter;

/**
 * 获取构造方法
 * @author Liyongzhe
 * @date 2020/12/14_10:21
 */
public class ConstructTest {

    /**
     * 获取所有的公众方法
     * @throws ClassNotFoundException
     */
    public void findAllPublicConstruct()throws ClassNotFoundException{
        Class<?> personClass = Class.forName("com.xwtech.test.反射.person.Person");
        //获取所有的公共方法
        Constructor<?>[] constructors = personClass.getConstructors();
        //获取所有的构造方法  public private protected 默认修饰的构造方法
        showConstructorsInfo(constructors);
    }

    /**
     * 获取所有的构造方法
     * @throws ClassNotFoundException
     */
    public void findAllConstructors() throws ClassNotFoundException{
        Class<?> personClass = Class.forName("com.xwtech.test.反射.person.Person");
        Constructor<?>[] constructors = personClass.getDeclaredConstructors();
        showConstructorsInfo(constructors);
    }

    /**
     *  获取public 修饰的构造函数
     * @throws ClassNotFoundException
     * @throws NoSuchMethodException
     * @throws SecurityException
     */
    public void findPublicConstruct() throws ClassNotFoundException, NoSuchMethodException, SecurityException{
        Class<?> personClass = Class.forName("com.xwtech.test.反射.person.Person");
        Constructor<?> constructor = personClass.getConstructor();
        showConstructor(constructor);
    }

    /**
     * 获取public 修饰的带有阐述的构造函数
     * @throws ClassNotFoundException
     * @throws NoSuchMethodException
     */
    public void findPublicConstructWithParam() throws ClassNotFoundException, NoSuchMethodException {
        Class<?> personClass = Class.forName("com.xwtech.test.反射.person.Person");
        Constructor<?> constructor = personClass.getConstructor(String.class);
        showConstructor(constructor);
    }


    public void findConstructWithParam() throws ClassNotFoundException, NoSuchMethodException {
        Class<?> personClass = Class.forName("com.xwtech.test.反射.person.Person");
        Constructor<?> protectConstructor = personClass.getDeclaredConstructor(char.class);
        showConstructor(protectConstructor);
        System.out.println("=================================================");
        Constructor<?> privateConstructor = personClass.getDeclaredConstructor(Integer.class);
        showConstructor(privateConstructor);
        System.out.println("=================================================");
        Constructor<?> constructor = personClass.getDeclaredConstructor(String.class, Integer.class);
        showConstructor(constructor);
        System.out.println("=================================================");
        Constructor<?> publicConstructor = personClass.getDeclaredConstructor(String.class);
        showConstructor(publicConstructor);
        System.out.println("=================================================");
    }

    private void showConstructorsInfo(Constructor<?>[] constructors) {
        for (Constructor<?> constructor : constructors) {
            showConstructor(constructor);
            System.out.println("=================================================");

        }
    }

    private void showConstructor(Constructor constructor) {
        System.out.println("constructor:"+constructor);
        String name = constructor.getName();
        System.out.println("构造函数的名字:"+name);
        int parameterCount = constructor.getParameterCount();
        System.out.println("构造函数的数量:"+parameterCount);
        Parameter[] parameters = constructor.getParameters();
        for (Parameter parameter : parameters) {
            String parameterName = parameter.getName();
            String typeName = parameter.getType().getName();
            System.out.println("参数名称:"+parameterName+"类型是:"+typeName);
        }
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException{
        ConstructTest constructTest = new ConstructTest();
//        constructTest.findAllPublicConstruct();
//        constructTest.findAllConstructors();
//        constructTest.findPublicConstruct();
//        constructTest.findPublicConstructWithParam();
            constructTest.findConstructWithParam();
    }

}

打印结果

- 公共构造方法
constructor:public com.xwtech.test.反射.person.Person()
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:0
=================================================
constructor:public com.xwtech.test.反射.person.Person(java.lang.String)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:java.lang.String
=================================================

- 所有构方法
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:0
=================================================
constructor:public com.xwtech.test.反射.person.Person(java.lang.String)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:java.lang.String
=================================================
constructor:com.xwtech.test.反射.person.Person(java.lang.String,java.lang.Integer)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:2
参数名称:arg0类型是:java.lang.String
参数名称:arg1类型是:java.lang.Integer
=================================================
constructor:private com.xwtech.test.反射.person.Person(java.lang.Integer)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:java.lang.Integer
=================================================
constructor:protected com.xwtech.test.反射.person.Person(char)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:char
=================================================

- 获取指定参数和不指参数的构造方法
+ 获取不指定阐述的构造方法
constructor:public com.xwtech.test.反射.person.Person()
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:0

+ 获取指定阐述的构造方法
=================================================
constructor:public com.xwtech.test.反射.person.Person(java.lang.String)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:java.lang.String

- 获取指定参数的私有构造方法
constructor:protected com.xwtech.test.反射.person.Person(char)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:char
=================================================
constructor:private com.xwtech.test.反射.person.Person(java.lang.Integer)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:java.lang.Integer
=================================================
constructor:com.xwtech.test.反射.person.Person(java.lang.String,java.lang.Integer)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:2
参数名称:arg0类型是:java.lang.String
参数名称:arg1类型是:java.lang.Integer
=================================================
constructor:public com.xwtech.test.反射.person.Person(java.lang.String)
构造函数的名字:com.xwtech.test.反射.person.Person
构造函数的数量:1
参数名称:arg0类型是:java.lang.String
=================================================

创建对象

package com.xwtech.test.反射.person;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/**
 * @author Liyongzhe
 * @date 2020/12/14_14:57
 */
public class CreatObject {

   public static Class<?> clazz;

    static {
        try {
            clazz = Class.forName("com.xwtech.test.反射.person.Person");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 公共默认创建对象
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public void defaultFun() throws IllegalAccessException, InstantiationException {
        Person person = (Person) clazz.newInstance();
        String name = person.getName();
        System.out.println("公共默认创建对象:"+name);
    }


    /**
     * 公共构造指定参数类型创建对象
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public void publicConstructorWithParam() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Constructor<?> constructor = clazz.getConstructor(String.class);
        Person liyongzhe = (Person) constructor.newInstance("liyongzhe");
        String name = liyongzhe.getName();
        System.out.println("指定参数创建对象:"+name);
    }

    /**
     * 私有构造指定参数创建对象
     * @throws NoSuchMethodException
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws InstantiationException
     */
    public void constructorWithParam() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        Constructor<?> protectConstructor = clazz.getDeclaredConstructor(char.class);
        Person liyongzhe_char = (Person) protectConstructor.newInstance('男');
        char sex = liyongzhe_char.sex;
        System.out.println("liyongzhe_char sex :" + sex);
        System.out.println("========================================================");

        Constructor<?> privateConstructor = clazz.getDeclaredConstructor(Integer.class);
        //暴力访问
        privateConstructor.setAccessible(true);
        Person liyongzhe_Integer = (Person) privateConstructor.newInstance(18);
        Integer age = liyongzhe_Integer.getAge();
        System.out.println("liyongzhe_Integer age :" + age);
        System.out.println("========================================================");

        Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
        Person liyongzhe_name_age = (Person) constructor.newInstance("liyongzhe",18);
        String name = liyongzhe_name_age.getName();
        Integer age1 = liyongzhe_name_age.getAge();
        System.out.println("liyongzhe_name:"+name+","+"liyongzhe_age:"+age1);
        System.out.println("========================================================");

        Constructor<?> publicConstructor = clazz.getDeclaredConstructor(String.class);
        Person liyongzhe_name = (Person) publicConstructor.newInstance("liyongzhe");
        String name1 = liyongzhe_name.getName();
        System.out.println("liyongzhe_name1:" + name1);
    }

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException {
        CreatObject creatObject = new CreatObject();
//        creatObject.defaultFun();
//        creatObject.publicConstructorWithParam();
        creatObject.constructorWithParam();
    }
}
输出结果
- 公共默认构架对象
public Person()
公共默认创建对象:default

- 公共构造指定参数类型创造对象
public Person(String name)
指定参数创建对象:liyongzhe

- 私有构造指定参数创建对象
protected Person(char sex)
liyongzhe_char sex :男
========================================================
private Person(Integer age)
liyongzhe_Integer age :18
========================================================
Person(String name,Integer age)
liyongzhe_name:liyongzhe,liyongzhe_age:18
========================================================
public Person(String name)
liyongzhe_name1:liyongzhe

获取成员变量

打印结果
- 获取公共的成员变量
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务