[java]反射1 2017-06-25 21:50 79人阅读 评论(10) 收藏

很多东西的实现基础,都是反射,spring的AOP,动态代理等等,下面咱们来学习一下Java的反射

什么是反射?

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

反射可以做什么?

反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理。

java有哪些反射类?

java.lang.Class;
java.lang.reflect.Constructor; java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;

java如何实现反射?

通过反射实例化一个类的对象

    public class reflecetTest {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
            Class<?> test = null;
            test=Class.forName("com.reflect.Test.Person");
            //第一种方法,实例化默认构造方法,调用set赋值
            Person person= (Person) test.newInstance();
            person.setName("小明");
            person.setAddress("建国路");
            //第二种方法,取得全部的构造函数,使用构造函数赋值
            Constructor<?> constructor[]=test.getConstructors();
            //查看每个构造方法需要的参数
            for (int i = 0;i<constructor.length;i++){
                Class<?> clazzs[]=constructor[i].getParameterTypes();
                System.out.println("constructor["+i+"](");
                if (clazzs.length > 0){
                    for (int j=0; j<clazzs.length;j++){
                        if (j == clazzs.length -1 )
                            System.out.println(clazzs[j].getName());
                        else
                            System.out.println(clazzs[j].getName()+",");
                    }
                }
                System.out.print(")");
            }

           // person = (Person) constructor[0].newInstance("张三");
            System.out.println(person);
        }
    }

取得一个类的全部属性

    public class ReflectTest implements Serializable{
        public static void main(String[] args) throws ClassNotFoundException {
            Class<?> clazz = Class.forName("com.reflect.Test.Person");
            System.out.println("===========本类属性=============");
            Field[] fields = clazz.getDeclaredFields();
            for (int i =0; i<fields.length;i++){
                //权限修饰符
                int meth = fields[i].getModifiers();
                String priv = Modifier.toString(meth);
                //属性类型
                Class<?> type = fields[i].getType();
                System.out.println(priv +" "+type.getName() + " " + fields[i].getName() + ";");
            }

            System.out.println("=======实现的接口或者父类的属性=========");
            //取得实现的接口或者父类的属性
            Field[] fields1=clazz.getFields();
            for (int j = 0; j<fields1.length; j++){
                //权限修饰符
                int meth = fields1[j].getModifiers();
                String priv = Modifier.toString(meth);
                //属性类型
                Class<?> type = fields1[j].getType();
                System.out.println(priv + " " +type.getName() + " "+fields1[j].getName() + ";");
            }
        }
    }
原文地址:https://www.cnblogs.com/zhemeban/p/7183058.html