zoukankan      html  css  js  c++  java
  • [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() + ";");
                }
            }
        }
    
  • 相关阅读:
    微服务2:微服务全景架构
    SystemVerilog语言简介
    Slip打包与解包及MATLAB程序
    恶性卷积码
    通信原理之调制解调(2)QPSK
    FPGA仿真只适合开发定制IP的设计师?
    用CCS开发DSP应用程序的代码结构、加电装载及在线编程
    符号能量问题
    该如何选择?
    无线通信距离的计算
  • 原文地址:https://www.cnblogs.com/zhemeban/p/7183058.html
Copyright © 2011-2022 走看看