zoukankan      html  css  js  c++  java
  • Java 反射

      Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。使用反射Java程序可以加载一个运行时才得知名称的class,获悉其完整构造。

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

    • 在运行时判断任意一个对象所属的类;
    • 在运行时构造任意一个类的对象;
    • 在运行时判断任意一个类所具有的成员变量和方法;
    • 在运行时调用任意一个对象的方法;
    • 生成动态代理。

    优点: 
    (1)能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。 
    (2)与Java动态编译相结合,可以实现无比强大的功能 
    缺点: 
    (1)使用反射的性能较低 
    (2)使用反射相对来说不安全 
    (3)破坏了类的封装性,可以通过反射获取这个类的私有方法和属性 

    一、Class类

      Java所有类都是Class类的实例

    二、类的反射

      1.通过类名获取         类名.class
      2.通过对象获取         对象名.getClass()
      3.通过全类名获取      Class.forName(全类名)

    public class Test {
        
        public static void main(String[] args) throws ClassNotFoundException {
            Class class1 = User.class;
            Class class2 = new User().getClass();
            Class class3 = Class.forName("com.sa.pojo.User");
            System.out.println("className: " + class1.getName());
            // 父类
            Class parentClass = class1.getSuperclass();
            System.out.println("parentClass: " + parentClass.getName());
         // 接口
            Class[] interfaces = class1.getInterfaces(); 
            System.out.print("Interfaces:  ");
            for(Class clazz : interfaces) 
                System.out.print(clazz.getName() + " ");       
        }
    }

    运行结果         

      className: com.sa.pojo.User
      parentClass: java.lang.Object
      Interfaces: java.io.Serializable

    三、方法的反射

    public class Test {
        
        public static void main(String[] args) throws ClassNotFoundException {
            Class<?> clazz = User.class;
            Method[] methods = clazz.getDeclaredMethods();
            for(Method method : methods) {
                // 函数限定符、返回值类型
                System.out.print(Modifier.toString(method.getModifiers()) 
                     + " " + method.getReturnType().getName() + " " + method.getName() + "("); // 函数参数列表 Class<?> types[] = method.getParameterTypes(); if(types.length == 0) System.out.println(")"); else for(int i = 0; i < types.length; i++) System.out.print(types[i].getTypeName() + (i + 1 == types.length ? ") " : ",")); } } }

    运行结果     

      public java.lang.String toString()
      public java.lang.String getName()
      public void setName(java.lang.String)
      public int getAge()
      public void setAge(int)

    通过反射调用类方法

    public class Test {
        
        public static void main(String[] args) throws Exception {
            Class<?> clazz = User.class;
            Method method1 = clazz.getMethod("setName", String.class);
            Object obj = clazz.newInstance();
            method1.invoke(obj, "rose");
            Method method2 = clazz.getMethod("getName");
            String name = (String) method2.invoke(obj);
            System.out.println(obj);
        }
    }

    运行结果      User [age=0, name=rose]

    四、属性的反射

    public class Test {
        
        public static void main(String[] args) throws Exception {
            Class<?> clazz = User.class;
            // 打印类中的所有属性
            Field[] fields = clazz.getDeclaredFields();
            for(Field field : fields) {
                System.out.println(Modifier.toString(field.getModifiers()) + " " + field.getType().getName());
            }
            // 通过反射操作类中的字段
            Object obj = clazz.newInstance();
            Field field1 = clazz.getDeclaredField("age");
            field1.setAccessible(true);
            field1.set(obj, 100);
            System.out.println(obj);
        }
    }

     运行结果

      private int
      private java.lang.String
      User [age=100, name=null]

  • 相关阅读:
    docker安装
    linux磁盘空间挂载
    python之MD5加密
    python之pymysql
    python 之Redis笔记
    python 随机生成中文名字
    python之json笔记
    python时间模块笔记
    python 用pip安装pymysql(win7下)
    数据库操作番外篇~
  • 原文地址:https://www.cnblogs.com/anxiao/p/6762175.html
Copyright © 2011-2022 走看看