[Java]反射机制及构造对象

来源:互联网 发布:汽车最新导航软件 编辑:程序博客网 时间:2024/06/06 09:01

测试代码

package main;import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import bean.Animal;public class TestMain {    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub        showClass();        System.out.println("//////////////////////////////////////////////////////////");        System.out.println("使用一个参数的构造器...");        System.out.println(createAnimalByConstructor("bean.Cat", "Mr Cat"));        System.out.println(createAnimalByConstructor("bean.Dog", "Mr dog"));        System.out.println("使用两个参数的构造器...");        System.out.println(createAnimalByConstructor("bean.Cat", "Mr Cat",18));        System.out.println(createAnimalByConstructor("bean.Dog", "Mr dog",20));        System.out.println("使用method反射构造对象...");        System.out.println(createAnimalByMethod("bean.Bird","setAge", new Object[]{30}));        System.out.println(createAnimalByMethod("bean.Bird","setNameAndAge", new Object[]{"小燕子",30}));    }    public static Animal createAnimalByConstructor(String clazzStr,String name) throws Exception{        Class clazz = Class.forName(clazzStr);        Constructor constructor = clazz.getConstructor(name.getClass());        Animal animal = (Animal)constructor.newInstance(name);        return animal;    }    public static Animal createAnimalByConstructor(String clazzStr,String name,Integer age) throws Exception{        Class clazz = Class.forName(clazzStr);        Constructor constructor = clazz.getConstructor(new Class[]{name.getClass(),age.getClass()});        Animal animal = (Animal)constructor.newInstance(name,age);        return animal;    }    public static Object createAnimalByMethod(String clazzStr,String methodName,Object[] args) throws Exception{        Class clazz = Class.forName(clazzStr);        Object object = clazz.newInstance();        Class[] classes = new Class[args.length];        for(int i=0;i<args.length;i++){            classes[i] = args[i].getClass();        }        Method method = clazz.getMethod(methodName, classes);        method.invoke(object, args);        return object;    }    public static void showClass() throws ClassNotFoundException{        Class clazz = Class.forName("bean.Cat");        System.out.println(clazz);        Annotation[] annotations = clazz.getAnnotations();        System.out.println("Annotation...");        for(Annotation annotation:annotations){            System.out.println(annotation.toString()+" : "+annotation.annotationType());        }        Constructor[] constructors = clazz.getConstructors();        System.out.println("*********************************");        System.out.println("Constructor...");        for(Constructor constructor:constructors){            System.out.println("--------------------------------");            System.out.println(constructor.getName());            System.out.println(constructor.getModifiers());            Class[] parameterClasses = constructor.getParameterTypes();            System.out.println("getParameterTypes...");            for(Class parameterClass:parameterClasses){                System.out.println(parameterClass.getName());            }            System.out.println(constructor.getTypeParameters());        }        System.out.println("*********************************");        System.out.println("getDeclaredClasses...");        Class[] declaredClasses = clazz.getDeclaredClasses();        for(Class declaredClass:declaredClasses){            System.out.println(declaredClass.getName()+" : "+declaredClass.getSimpleName());        }        System.out.println("*********************************");        System.out.println("getDeclaredFields...");        Field[] fields = clazz.getDeclaredFields();        for(Field field:fields){            System.out.println(field.getName()+" : "+field.getType().getName());        }        System.out.println("*********************************");        System.out.println("getFields...");        fields = clazz.getFields();        for(Field field:fields){            System.out.println(field.getName()+" : "+field.getType().getName());        }        System.out.println("*********************************");        System.out.println("getSuperclass: "+clazz.getSuperclass().getName());        System.out.println("*********************************");        System.out.println("getDeclaredMethods...");        Method[] methods = clazz.getDeclaredMethods();        for(Method method:methods){            System.out.println("---------------------------");            System.out.println(method.getName());            Class[] parameters = method.getParameterTypes();            for(Class parameterClass:parameters){                System.out.println(parameterClass.getName()+" : "+parameterClass.getSimpleName());            }        }    }}

测试结果

class bean.CatAnnotation...*********************************Constructor...--------------------------------bean.Cat1getParameterTypes...java.lang.String[Ljava.lang.reflect.TypeVariable;@ae3865e--------------------------------bean.Cat1getParameterTypes...java.lang.Stringjava.lang.Integer[Ljava.lang.reflect.TypeVariable;@5f8a8ae7*********************************getDeclaredClasses...*********************************getDeclaredFields...age : java.lang.Integer*********************************getFields...*********************************getSuperclass: bean.Animal*********************************getDeclaredMethods...---------------------------toString---------------------------setAgejava.lang.Integer : Integer---------------------------getAge---------------------------eatjava.lang.String : String---------------------------eat//////////////////////////////////////////////////////////使用一个参数的构造器...Cat [age=null, toString()=Animal [name=Mr Cat]]Dog [age=null, toString()=Animal [name=Mr dog]]使用两个参数的构造器...Cat [age=18, toString()=Animal [name=Mr Cat]]Dog [age=20, toString()=Animal [name=Mr dog]]使用method反射构造对象...Bird [name=null, age=30]Bird [name=小燕子, age=30]
0 0
原创粉丝点击