zoukankan      html  css  js  c++  java
  • 反射

    1.什么是反射机制

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

    2.反射的特点:动态性

    3.通过反射调用成员变量及成员方法

    public class Person {
        private String name;
        private int age;
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Person(String name, int age) {
    
            this.name = name;
            this.age = age;
        }
        
        public Person(String name) {
            this.name = name;
        }
    
        public Person() {
        }
    
        public void show()
        {
            System.out.println("HelloWorld");
        }
    
        private  void  shownation(String nation)
        {
            System.out.println("HelloWorld"+nation);
            //return nation;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    //相对应的包
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    //具体使用
     Class zz = Person.class;
    
            Person person = (Person) zz.newInstance();
            Field f1 = zz.getDeclaredField("name");
            f1.setAccessible(true);
            f1.set(person, "aaaa");
            
            //private私有属性获取
            Field f2 = zz.getDeclaredField("age");
            f2.setAccessible(true);
            f2.set(person, 20);
    
            //通过反射调用运行时类的指定方法
            Method m1 = zz.getMethod("show");
            m1.invoke(person);
    
            Method m2 = zz.getDeclaredMethod("shownation", String.class);
            //私有的需要设置可见性
            m2.setAccessible(true);
            m2.invoke(person, "Canada");
    
            //通过反射创建对象----利用构造函数
            Constructor cons = zz.getConstructor(String.class, int.class);
            Object obj = cons.newInstance("pikaqiu~", 3);
            Person o = (Person) obj;
            System.out.println(o.toString());

    4.获取Class实例的方式

      //方式一:调用运行时类的属性  .class
            Class ss1=Person.class;
            System.out.println(ss1);
    
            //方式二:通过运行时类的对象,调用getClass()
            Person p1=new Person();
            Class ss2=p1.getClass();
            System.out.println(ss2);
    
            //方式三:调用Class的静态方法:forName(String classath)
            Class ss3=Class.forName("Person");
            System.out.println(ss3);

    5.类的加载

     程序经过javac.exe命令以后,会生成一个或多个字 节码文件(.class结尾)。
     接着我们使用java. exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程就称为类的加载

    6.运行时类

    加载到内存中的类,我们就称为运行时类,成为Class的一个实例

  • 相关阅读:
    GridView 激发了未处理的事件“RowEditing”
    C#中字符串转换成枚举类型的方法
    UltraEdit 应用程序发生错误0xc0000417
    配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法
    数据绑定中的一个问题"pages enableEventValidation="true""
    jquery json 格式教程
    Delphi的泛型学习
    Delphi取Ajax网页内容
    Delphi 中经常使用的正则表达式
    Delphi中的动态数组总结
  • 原文地址:https://www.cnblogs.com/ywqtro/p/12202776.html
Copyright © 2011-2022 走看看