Java反射机制总结二

来源:互联网 发布:淘宝卖家申诉入口 编辑:程序博客网 时间:2024/06/05 14:44

当我们获取到Class对象的时候,就可以用来获取Class的完整结构,包括构造器,属性,方法和其他的一些信息(父类,包名,接口等信息)。
person.java:

package com.tuxianchao;import java.util.Comparator;public class Person extends com.tuxianchao.Biont<String> implements Comparator<Person> {    int id;    private String name;    public int age;    public Person() {        System.out.println("空参构造器...");    }    public Person(String name) {        this.name = name;    }    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() throws Exception {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public void method(String nation) {        System.out.println("我的国籍是:" + nation);    }    public void method() {        System.out.println("我是" + name);    }    @Override    public String toString() {        return "Person [name=" + name + ", age=" + age + "]";    }    // 内部类,语言    class Language {        String LanguageName;        String LanguageLocation;        public Language() {        }        public Language(String languageName, String languageLocation) {            LanguageName = languageName;            LanguageLocation = languageLocation;        }        public String getLanguageName() {            return LanguageName;        }        public void setLanguageName(String languageName) {            LanguageName = languageName;        }        public String getLanguageLocation() {            return LanguageLocation;        }        public void setLanguageLocation(String languageLocation) {            LanguageLocation = languageLocation;        }    }    @Override    public int compare(Person o1, Person o2) {        // TODO Auto-generated method stub        return 0;    }}

Biont.java:

package com.tuxianchao;/** * 生物类 *  * @author tuxianchao * */public class Biont<T> {    private double weight;    public Biont() {    }    public Biont(double weight) {        super();        this.weight = weight;    }    public double getWeight() {        return weight;    }    public void setWeight(double weight) {        this.weight = weight;    }    public void breath() {        System.out.println("呼吸..");    }}

获取构造器信息

package com.tuxianchao;import java.lang.reflect.Constructor;import org.junit.Test;public class TestConstructor {    @Test    public void test4() throws Exception {        // 调用指定的构造函数来创建运行时类的对象        String className = "com.tuxianchao.Person";        Class clazz = Class.forName(className);        Constructor constructor = clazz.getConstructor(String.class);        constructor.setAccessible(true);        Person p1 = (Person) constructor.newInstance("Zhang");        System.out.println(p1);        Constructor constructor2 = clazz.getConstructor(String.class, int.class);        constructor2.setAccessible(true);        Person p2 = (Person) constructor2.newInstance("Li", 20);        System.out.println(p2);        // 控制台打印        /**         * Person [name=Zhang, age=0]         * Person [name=Li, age=20]         */    }    @Test    public void test3() throws Exception {        // 创建运行时类的对象        String className = "com.tuxianchao.Person";        Class clazz = Class.forName(className);        // 调用的是空参构造函数来构造对象        // 就要求:运行时类需要有空参构造器,且权限足够        // 创建类的时候尽量保留一个空参的构造器:1.便于反射的时候使用(newInstance),2.被继承时子类默认调用父类的空参构造器        Person p = (Person) clazz.newInstance();        System.out.println(p);        // 控制台打印        /*         * 空参构造器...         * Person [name=null, age=0]         */    }    @Test    public void test1() throws Exception {        // 获取运行时类的构造器        String className = "com.tuxianchao.Person";        Class clazz = Class.forName(className);        Constructor[] constructors = clazz.getConstructors();        for (Constructor constructor : constructors) {            System.out.println(constructor.getName());            Class[] classes = constructor.getParameterTypes();            System.out.println("形参列表:");            for (Class class1 : classes) {                System.out.println(class1.getName());            }            System.out.println("----");        }        // 控制台打印        /**         *          *          * com.tuxianchao.Person          * 形参列表: java.lang.String int         *  ----         * com.tuxianchao.Person          * 形参列表: java.lang.String          *  ----         * com.tuxianchao.Person          * 形参列表:         *  ----         *          */    }}

获取属性信息

package com.tuxianchao;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import org.junit.Test;public class TestField {    @Test    public void test3() {        Class clazz = Person.class;        // 获取属性的权限修饰符,变量类型和变量名        Field field2[] = clazz.getDeclaredFields();        for (int i = 0; i < field2.length; i++) {            // 1.获取属性的权限修饰符            int mod = field2[i].getModifiers();            System.out.println(Modifier.toString(mod));            // 2.获取属性的变量类型            System.out.println(field2[i].getType());            // 3.获取属性的变量名            System.out.println(field2[i].getName());            System.out.println("--------");        }        // 控制台打印        /**         *          *          * int id          * --------          * private          * class java.lang.String          * name          * --------          * public         * int          * age          * --------         *          */    }    @Test    public void test2() {        // 获取运行时类的属性        Class clazz = Person.class;        // 1.getFields()方法只能获取到运行时类极其父类中声明为public的属性        Field field[] = clazz.getFields();        for (int i = 0; i < field.length; i++) {            System.out.println(field[i]);        }        System.out.println("--------------");        // 2.getDeclaredFields()获取运行时类本身声明的属性(不包括父类中的)        Field field2[] = clazz.getDeclaredFields();        for (int i = 0; i < field2.length; i++) {            System.out.println(field2[i]);        }    }    // 控制台打印    /**     *      * public int com.tuxianchao.Person.age      * --------------      * int com.tuxianchao.Person.id      * private java.lang.String com.tuxianchao.Person.name      * public int com.tuxianchao.Person.age     *      */}

获取方法信息

package com.tuxianchao;import java.lang.annotation.Annotation;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import org.junit.Test;public class TestMetod {    @Test    public void test3() {    }    @Test    public void test2() throws Exception {        // 获取方法的注解,权限修饰符,返回值类型,方法名,形参列表,异常        String className = "com.tuxianchao.Person";        Class<?> clazz = Class.forName(className);        Method method1[] = clazz.getMethods();        for (int i = 0; i < method1.length; i++) {            // 获取注解            Annotation[] annotation = method1[i].getAnnotations();            System.out.println("注解:");            for (Annotation annotation2 : annotation) {                System.out.println(annotation2);            }            // 获取权限修饰符            int mod = method1[i].getModifiers();            System.out.println("权限修饰符:" + Modifier.toString(mod));            // 获取返回值类型            System.out.println("返回值类型:" + method1[i].getReturnType());            // 获取方法名            System.out.println("方法名:" + method1[i].getName());            // 获取形参列表            Class[] parameters = method1[i].getParameterTypes();            System.out.println("形参列表:");            for (Class class1 : parameters) {                System.out.println(class1.getName());            }            // 获取抛出的异常            Class[] exceptiopns = method1[i].getExceptionTypes();            System.out.println("异常:");            for (Class class1 : exceptiopns) {                System.out.println(class1.getName());            }            System.out.println("------------------");        }        // 控制台打印        /*                注解:                权限修饰符:public                返回值类型:class java.lang.String                方法名:toString                形参列表:                异常:                ------------------                注解:                权限修饰符:public                返回值类型:class java.lang.String                方法名:getName                形参列表:                异常:                java.lang.Exception                ------------------                注解:                权限修饰符:public                返回值类型:int                方法名:compare                形参列表:                com.tuxianchao.Person                com.tuxianchao.Person                异常:                ------------------                注解:                权限修饰符:public volatile                返回值类型:int                方法名:compare                形参列表:                java.lang.Object                java.lang.Object                异常:                ------------------                注解:                权限修饰符:public                返回值类型:void                方法名:setName                形参列表:                java.lang.String                异常:                ------------------                注解:                权限修饰符:public                返回值类型:void                方法名:method                形参列表:                异常:                ------------------                注解:                权限修饰符:public                返回值类型:void                方法名:method                形参列表:                java.lang.String                异常:                ------------------                注解:                权限修饰符:public                返回值类型:void                方法名:setAge                形参列表:                int                异常:                ------------------                注解:                权限修饰符:public                返回值类型:int                方法名:getAge                形参列表:                异常:                ------------------                注解:                权限修饰符:public                返回值类型:void                方法名:setWeight                形参列表:                double                异常:                ------------------                注解:                权限修饰符:public                返回值类型:double                方法名:getWeight                形参列表:                异常:                ------------------                注解:                权限修饰符:public                返回值类型:void                方法名:breath                形参列表:                异常:                ------------------                注解:                权限修饰符:public final                返回值类型:void                方法名:wait                形参列表:                异常:                java.lang.InterruptedException                ------------------                注解:                权限修饰符:public final                返回值类型:void                方法名:wait                形参列表:                long                int                异常:                java.lang.InterruptedException                ------------------                注解:                权限修饰符:public final native                返回值类型:void                方法名:wait                形参列表:                long                异常:                java.lang.InterruptedException                ------------------                注解:                权限修饰符:public                返回值类型:boolean                方法名:equals                形参列表:                java.lang.Object                异常:                ------------------                注解:                权限修饰符:public native                返回值类型:int                方法名:hashCode                形参列表:                异常:                ------------------                注解:                权限修饰符:public final native                返回值类型:class java.lang.Class                方法名:getClass                形参列表:                异常:                ------------------                注解:                权限修饰符:public final native                返回值类型:void                方法名:notify                形参列表:                异常:                ------------------                注解:                权限修饰符:public final native                返回值类型:void                方法名:notifyAll                形参列表:                异常:                ------------------                注解:                权限修饰符:public                返回值类型:interface java.util.Comparator                方法名:reversed                形参列表:                异常:                ------------------                注解:                权限修饰符:public                返回值类型:interface java.util.Comparator                方法名:thenComparing                形参列表:                java.util.function.Function                异常:                ------------------                注解:                权限修饰符:public                返回值类型:interface java.util.Comparator                方法名:thenComparing                形参列表:                java.util.Comparator                异常:                ------------------                注解:                权限修饰符:public                返回值类型:interface java.util.Comparator                方法名:thenComparing                形参列表:                java.util.function.Function                java.util.Comparator                异常:                ------------------                注解:                权限修饰符:public                返回值类型:interface java.util.Comparator                方法名:thenComparingDouble                形参列表:                java.util.function.ToDoubleFunction                异常:                ------------------                注解:                权限修饰符:public                返回值类型:interface java.util.Comparator                方法名:thenComparingInt                形参列表:                java.util.function.ToIntFunction                异常:                ------------------                注解:                权限修饰符:public                返回值类型:interface java.util.Comparator                方法名:thenComparingLong                形参列表:                java.util.function.ToLongFunction                异常:                ------------------         */    }    @Test    public void test1() throws Exception {        // 获取运行时类的方法        String className = "com.tuxianchao.Person";        Class<?> clazz = Class.forName(className);        // 1.获取所有方法        // getMethods()方法获取运行时类和其父类声明为public的方法        Method method1[] = clazz.getMethods();        for (int i = 0; i < method1.length; i++) {            System.out.println(method1[i]);        }        System.out.println("-------------------------");        // getDeclaredMethods()方法获取运行时类本身声明的所有方法        Method method2[] = clazz.getDeclaredMethods();        for (int i = 0; i < method2.length; i++) {            System.out.println(method2[i]);        }        System.out.println("-------------------------");        // 2.获取指定方法        Method method3 = clazz.getMethod("setAge", int.class);        System.out.println(method3);    }    // 控制台打印    /*     *  public java.lang.String com.tuxianchao.Person.toString()        public java.lang.String com.tuxianchao.Person.getName() throws java.lang.Exception        public int com.tuxianchao.Person.compare(com.tuxianchao.Person,com.tuxianchao.Person)        public int com.tuxianchao.Person.compare(java.lang.Object,java.lang.Object)        public void com.tuxianchao.Person.setName(java.lang.String)        public void com.tuxianchao.Person.method()        public void com.tuxianchao.Person.method(java.lang.String)        public void com.tuxianchao.Person.setAge(int)        public int com.tuxianchao.Person.getAge()        public void com.tuxianchao.Biont.setWeight(double)        public double com.tuxianchao.Biont.getWeight()        public void com.tuxianchao.Biont.breath()        public final void java.lang.Object.wait() throws java.lang.InterruptedException        public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException        public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException        public boolean java.lang.Object.equals(java.lang.Object)        public native int java.lang.Object.hashCode()        public final native java.lang.Class java.lang.Object.getClass()        public final native void java.lang.Object.notify()        public final native void java.lang.Object.notifyAll()        public default java.util.Comparator java.util.Comparator.reversed()        public default java.util.Comparator java.util.Comparator.thenComparing(java.util.function.Function)        public default java.util.Comparator java.util.Comparator.thenComparing(java.util.Comparator)        public default java.util.Comparator java.util.Comparator.thenComparing(java.util.function.Function,java.util.Comparator)        public default java.util.Comparator java.util.Comparator.thenComparingDouble(java.util.function.ToDoubleFunction)        public default java.util.Comparator java.util.Comparator.thenComparingInt(java.util.function.ToIntFunction)        public default java.util.Comparator java.util.Comparator.thenComparingLong(java.util.function.ToLongFunction)        -------------------------        public java.lang.String com.tuxianchao.Person.toString()        public java.lang.String com.tuxianchao.Person.getName() throws java.lang.Exception        public int com.tuxianchao.Person.compare(com.tuxianchao.Person,com.tuxianchao.Person)        public int com.tuxianchao.Person.compare(java.lang.Object,java.lang.Object)        public void com.tuxianchao.Person.setName(java.lang.String)        public void com.tuxianchao.Person.method()        public void com.tuxianchao.Person.method(java.lang.String)        public void com.tuxianchao.Person.setAge(int)        public int com.tuxianchao.Person.getAge()        -------------------------        public void com.tuxianchao.Person.setAge(int)     */}

获取类的其他相关信息

package com.tuxianchao;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import org.junit.Test;public class TestOthers {    @Test    public void test4() throws Exception {        // 获取所在的包        String className = "com.tuxianchao.Person";        Class clazz = Class.forName(className);        Package package1 = clazz.getPackage();        System.out.println(package1.getName());        // 控制台打印        /*            com.tuxianchao         */    }    @Test    public void test3() throws Exception {        // 获取实现的接口        String className = "com.tuxianchao.Person";        Class clazz = Class.forName(className);        Class[] classes = clazz.getInterfaces();// 只能获取到本身实现的接口,获取不到接口的父接口        for (Class class1 : classes) {            System.out.println(class1.getName());        }        // 控制台打印        /*            java.util.Comparator         */    }    @Test    public void test2() throws Exception {        // 获取父类的泛型        String className = "com.tuxianchao.Person";        Class clazz = Class.forName(className);        Type type = clazz.getGenericSuperclass();        ParameterizedType param = (ParameterizedType) type;        Type[] types = param.getActualTypeArguments();        for (Type type2 : types) {            System.out.println(((Class) type2).getName());        }        // 控制台打印        /*         *             java.lang.String         */    }    @Test    public void test1() throws Exception {        // 获取运行时类的父类        String className = "com.tuxianchao.Person";        Class clazz = Class.forName(className);        Class superClazz = clazz.getSuperclass();        System.out.println(superClazz);        // 获取带有泛型的父类        Type superClazz1 = clazz.getGenericSuperclass();        System.out.println(superClazz1);    }    // 控制台打印    /*        class com.tuxianchao.Biont        com.tuxianchao.Biont<java.lang.String>     */}
0 0