zl程序教程

您现在的位置是:首页 >  其它

当前栏目

Reflector、ReflectorFactory的前世

前世
2023-09-14 09:14:05 时间

一、如何获得Class对象

1、Class.forName(“类的全限定名”)

2、实例对象.getClass()

3、类名.class (类字面常量)

实验代码:

@Slf4j
public class ClassTest {

    public static void main(String[] args) throws ClassNotFoundException {
        // 1、获取class对象
        Class childrenClass = Children.class;
        log.info("class={}", childrenClass);
        Class forName = Class.forName("com.ceam.coll.clazz.Children");
        log.info("class={}", forName);
        Children children = new Children(18);
        Class childrenClass1 = children.getClass();
        log.info("class={}", childrenClass1);
    }

}

class Father {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Children extends Father{
    private String name;
    private Integer age;
    public Children(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

实验结果:

二、Class类的方法

方法说明
forName()(1)获取Class对象的一个引用,但引用的类还没有加载(该类的第一个对象没有生成)就加载了这个类。
(2)为了产生Class引用,forName()立即就进行了初始化。
getClass()获取Class对象的一个引用,返回表示该对象的实际类型的Class引用。
getName()取全限定的类名(包括包名),即类的完整名字。
getSimpleName()获取类名(不包括包名)
getCanonicalName()获取全限定的类名(包括包名)
isInterface()判断Class对象是否是表示一个接口
getInterfaces()返回Class对象数组,表示Class对象所引用的类所实现的所有接口
getSupercalss()返回Class对象,表示Class对象所引用的类所继承的直接基类。应用该方法可在运行时发现一个对象完整的继承结构。
newInstance()返回一个Oject对象,是实现“虚拟构造器”的一种途径。使用该方法创建的类,必须带有无参的构造器
getFields()获得某个类的所有的公共(public)的字段,包括继承自父类的所有公共字段。 类似的还有getMethods和getConstructors。
getDeclaredFields获得某个类的自己声明的字段,即包括public、private和proteced,默认但是不包括父类声明的任何字段。类似的还有getDeclaredMethods和getDeclaredConstructors。

1、getName()取全限定的类名(包括包名),即类的完整名字。

        String name = childrenClass.getName();
        log.info("name = {}", name);
10:27:13.381 [main] INFO com.ceam.coll.clazz.ClassTest - name = com.ceam.coll.clazz.Children

2、getSimpleName()获取类名(不包括包名)

        String simpleName = childrenClass.getSimpleName();
        log.info("simpleName = {}", simpleName);
10:27:13.381 [main] INFO com.ceam.coll.clazz.ClassTest - simpleName = Children

3、getCanonicalName()获取全限定的类名(包括包名)

        Class innerClass = innerClass.class;
        String canonicalName = innerClass.getCanonicalName();
        log.info("canonicalName = {}", canonicalName);
        String name1 = innerClass.getName();
        log.info("name = {}", name1);
    }

    static class innerClass {

    }
10:35:50.488 [main] INFO  - canonicalName = com.ceam.coll.clazz.ClassTest.innerClass
10:35:50.488 [main] INFO  - name = com.ceam.coll.clazz.ClassTest$innerClass

4、getInterfaces()返回Class对象数组,表示Class对象所引用的类所实现的所有接口

        Class[] interfaces = childrenClass.getInterfaces();
        for (int i = 0; i < interfaces.length; i++) {
            log.info("interfaces = {}", interfaces[i]);
        }

class Children extends Father implements if1,if2 {
    private String name;
    private Integer age;
    public Children(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

interface if1 {

}

interface if2 {

}
11:01:22.007 [main] INFO - interfaces = interface com.ceam.coll.clazz.if1
11:01:22.007 [main] INFO - interfaces = interface com.ceam.coll.clazz.if2

5、getSupercalss()返回Class对象,表示Class对象所引用的类所继承的直接基类

        Class superclass = childrenClass.getSuperclass();
        log.info("superclass = {}", superclass);
11:04:22.283 [main] INFO com.ceam.coll.clazz.ClassTest - superclass = class com.ceam.coll.clazz.Father

6、newInstance()返回一个Oject对象,是实现“虚拟构造器”的一种途径。使用该方法创建的类,必须带有无参的构造器

        Children instance1 = (Children)childrenClass.newInstance();
        Father instance2 = (Children)childrenClass.newInstance();
        Father instance3 = (Father)childrenClass.newInstance();
        log.info("instance = {}", instance1);
        log.info("instance = {}", instance2);
        log.info("instance = {}", instance3);
11:11:24.919 [main] INFO com.ceam.coll.clazz.ClassTest - instance = com.ceam.coll.clazz.Children@48533e64
11:11:24.919 [main] INFO com.ceam.coll.clazz.ClassTest - instance = com.ceam.coll.clazz.Children@64a294a6
11:11:24.919 [main] INFO com.ceam.coll.clazz.ClassTest - instance = com.ceam.coll.clazz.Children@7e0b37bc

7、getFields()获得某个类的所有的公共(public)的字段,包括继承自父类的所有公共字段。 类似的还有getMethodsgetConstructors

        Field[] fields = childrenClass.getFields();
        for (int i = 0; i < fields.length; i++) {
            log.info("fields = {}", fields[i]);
            log.info("fields name = {}", fields[i].getName());
            log.info("fields type = {}", fields[i].getType());
            log.info("fields Modifiers = {}", fields[i].getModifiers());
            log.info("fields GenericType = {}", fields[i].getGenericType());
            log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        }
 - fields = public java.lang.String com.ceam.coll.clazz.Children.name
 - fields name = name
 - fields type = class java.lang.String
 - fields Modifiers = 1
 - fields GenericType = class java.lang.String
 - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 - fields = public java.lang.Integer com.ceam.coll.clazz.Children.age
 - fields name = age
 - fields type = class java.lang.Integer
 - fields Modifiers = 1
 - fields GenericType = class java.lang.Integer
 - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 - fields = public java.lang.String com.ceam.coll.clazz.Father.money
 - fields name = money
 - fields type = class java.lang.String
 - fields Modifiers = 1
 - fields GenericType = class java.lang.String
 - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

8、getDeclaredFields()获得某个类的自己声明的字段,即包括public、privateproteced,默认但是不包括父类声明的任何字段。类似的还有getDeclaredMethodsgetDeclaredConstructors

        Field[] declaredFields = childrenClass.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            log.info("declaredFields = {}", declaredFields[i]);
        }
11:22:44.298 [main] INFO - declaredFields = public java.lang.String com.ceam.coll.clazz.Children.name
11:22:44.298 [main] INFO - declaredFields = public java.lang.Integer com.ceam.coll.clazz.Children.age
11:22:44.299 [main] INFO - declaredFields = private java.lang.String com.ceam.coll.clazz.Children.grilFrined

9、getDeclaredMethods()获取自己声明的所有非构造方法(包括父类被重写的方法)。

        Method[] declaredMethods = childrenClass.getDeclaredMethods();
        for (int i = 0; i < declaredMethods.length; i++) {
            log.info("declaredMethods = {}", declaredMethods[i]);
            log.info("declaredMethods name = {}", declaredMethods[i].getName());
            log.info("declaredMethods returnType = {}", declaredMethods[i].getReturnType());
            log.info("declaredMethods parameterTypes = {}", declaredMethods[i].getParameterTypes());
            log.info("declaredMethods parameterCount = {}", declaredMethods[i].getParameterCount());
            log.info("declaredMethods parameters = {}", declaredMethods[i].getParameters());
            log.info("*************************************************************************{}");
        }



class Children extends Father implements if1,if2 {
    public String name;
    public Integer age;
    private String girlFriend;

    Children() {

    }

    public Children(String girlFriend, Integer age) {
        this.age = age;
        this.girlFriend = girlFriend;
    }

    public Children age(Integer age) {
        this.age = age;
        return this;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private void love(GirlFriend girlFriend) {

    }

    private class GirlFriend {

    }
}
 - declaredMethods = public java.lang.String com.ceam.coll.clazz.Children.getName()
 - declaredMethods name = getName
 - declaredMethods returnType = class java.lang.String
 - declaredMethods parameterTypes = {}
 - declaredMethods parameterCount = 0
 - declaredMethods parameters = {}
 - *************************************************************************
 - declaredMethods = public void com.ceam.coll.clazz.Children.setName(java.lang.String)
 - declaredMethods name = setName
 - declaredMethods returnType = void
 - declaredMethods parameterTypes = class java.lang.String
 - declaredMethods parameterCount = 1
 - declaredMethods parameters = java.lang.String name
t - *************************************************************************
 - declaredMethods = public java.util.List com.ceam.coll.clazz.Children.money()
 - declaredMethods name = money
 - declaredMethods returnType = interface java.util.List
 - declaredMethods parameterTypes = {}
 - declaredMethods parameterCount = 0
 - declaredMethods parameters = {}
 - *************************************************************************
 - declaredMethods = public java.util.ArrayList com.ceam.coll.clazz.Children.money()
 - declaredMethods name = money
 - declaredMethods returnType = class java.util.ArrayList
 - declaredMethods parameterTypes = {}
 - declaredMethods parameterCount = 0
 - declaredMethods parameters = {}
 - *************************************************************************
 - declaredMethods = public com.ceam.coll.clazz.Children com.ceam.coll.clazz.Children.age(java.lang.Integer)
 - declaredMethods name = age
 - declaredMethods returnType = class com.ceam.coll.clazz.Children
 - declaredMethods parameterTypes = class java.lang.Integer
 - declaredMethods parameterCount = 1
 - declaredMethods parameters = java.lang.Integer age
 - *************************************************************************
 - declaredMethods = private void com.ceam.coll.clazz.Children.love(com.ceam.coll.clazz.Children$GirlFriend)
 - declaredMethods name = love
 - declaredMethods returnType = void
 - declaredMethods parameterTypes = class com.ceam.coll.clazz.Children$GirlFriend
 - declaredMethods parameterCount = 1
 - declaredMethods parameters = com.ceam.coll.clazz.Children$GirlFriend girlFriend
 - *************************************************************************

10、getDeclaredConstructors()获取自己声明的所有构造方法。

        Constructor[] declaredConstructors = childrenClass.getDeclaredConstructors();
        for (int i = 0; i < declaredConstructors.length; i++) {
            log.info("declaredConstructors = {}", declaredConstructors[i]);
        }
 - declaredConstructors = com.ceam.coll.clazz.Children()
 - declaredConstructors = public com.ceam.coll.clazz.Children(java.lang.String,java.lang.Integer)

11、代码清单

@Slf4j
public class ClassTest {

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        // 1、获取class对象
        Class childrenClass = Children.class;
        log.info("class = {}", childrenClass);
        Class forName = Class.forName("com.ceam.coll.clazz.Children");
        log.info("class = {}", forName);
        Children children = new Children();
        Class childrenClass1 = children.getClass();
        log.info("class = {}", childrenClass1);

        // 2、
        String name = childrenClass.getName();
        log.info("name = {}", name);

        String simpleName = childrenClass.getSimpleName();
        log.info("simpleName = {}", simpleName);

        Class[] interfaces = childrenClass.getInterfaces();
        for (int i = 0; i < interfaces.length; i++) {
            log.info("interfaces = {}", interfaces[i]);
        }

        Class superclass = childrenClass.getSuperclass();
        log.info("superclass = {}", superclass);

        Children instance1 = (Children)childrenClass.newInstance();
        Father instance2 = (Children)childrenClass.newInstance();
        Father instance3 = (Father)childrenClass.newInstance();
        log.info("instance = {}", instance1);
        log.info("instance = {}", instance2);
        log.info("instance = {}", instance3);

        Field[] fields = childrenClass.getFields();
        for (int i = 0; i < fields.length; i++) {
            log.info("fields = {}", fields[i]);
            log.info("fields name = {}", fields[i].getName());
            log.info("fields type = {}", fields[i].getType());
            log.info("fields Modifiers = {}", fields[i].getModifiers());
            log.info("fields GenericType = {}", fields[i].getGenericType());
            log.info(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
        }

        Field[] declaredFields = childrenClass.getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            log.info("declaredFields = {}", declaredFields[i]);
        }

        Method[] declaredMethods = childrenClass.getDeclaredMethods();
        for (int i = 0; i < declaredMethods.length; i++) {
            log.info("declaredMethods = {}", declaredMethods[i]);
            log.info("declaredMethods name = {}", declaredMethods[i].getName());
            log.info("declaredMethods returnType = {}", declaredMethods[i].getReturnType());
            log.info("declaredMethods parameterTypes = {}", declaredMethods[i].getParameterTypes());
            log.info("declaredMethods parameterCount = {}", declaredMethods[i].getParameterCount());
            log.info("declaredMethods parameters = {}", declaredMethods[i].getParameters());
            log.info("*************************************************************************");
        }

        Constructor[] declaredConstructors = childrenClass.getDeclaredConstructors();
        for (int i = 0; i < declaredConstructors.length; i++) {
            log.info("declaredConstructors = {}", declaredConstructors[i]);
        }

        Class innerClass = innerClass.class;
        String canonicalName = innerClass.getCanonicalName();
        log.info("canonicalName = {}", canonicalName);
        String name1 = innerClass.getName();
        log.info("name = {}", name1);
    }

    static class innerClass {

    }

}

class Father {
    private String name;
    public String money;

    public List<String> money() {
        return null;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class Children extends Father implements if1,if2 {
    public String name;
    public Integer age;
    private String girlFriend;

    Children() {

    }

    public Children(String girlFriend, Integer age) {
        this.age = age;
        this.girlFriend = girlFriend;
    }

    public Children age(Integer age) {
        this.age = age;
        return this;
    }

    public ArrayList<String> money() {
        return null;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private void love(GirlFriend girlFriend) {

    }

    private class GirlFriend {

    }
}

interface if1 {

}

interface if2 {

}