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

测试代码

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.Cat
Annotation...
*********************************
Constructor...
--------------------------------
bean.Cat
1
getParameterTypes...
java.lang.String
[Ljava.lang.reflect.TypeVariable;@ae3865e
--------------------------------
bean.Cat
1
getParameterTypes...
java.lang.String
java.lang.Integer
[Ljava.lang.reflect.TypeVariable;@5f8a8ae7
*********************************
getDeclaredClasses...
*********************************
getDeclaredFields...
age : java.lang.Integer
*********************************
getFields...
*********************************
getSuperclass: bean.Animal
*********************************
getDeclaredMethods...
---------------------------
toString
---------------------------
setAge
java.lang.Integer : Integer
---------------------------
getAge
---------------------------
eat
java.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]
发布了170 篇原创文章 · 获赞 30 · 访问量 61万+

猜你喜欢

转载自blog.csdn.net/u010989191/article/details/53493873