zoukankan      html  css  js  c++  java
  • JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;

    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 

    动态获取类中信息,就是java反射 。可以理解为对类的解剖。

    反射机制图解说明:

    先创建一个字节码文件:

    public class Person {
    
        private int age;
        private String name;
        
        public Person(String name,int age) {
            super();
            this.age = age;
            this.name = name;
            
            System.out.println("Person param run..."+this.name+":"+this.age);
        
        }
        public Person() {
            super();
            
            System.out.println("person run");
            
            
        }
        
        public void show(){
            System.out.println(name+"...show run..."+age);
        }
        
        private void privateMethod(){
            System.out.println(" method run ");
        }
        
        public void paramMethod(String str,int num){
            System.out.println("paramMethod run....."+str+":"+num);
            
        }
        public static void staticMethod(){
            System.out.println(" static method run......");
        }
    }

    要想要对字节码文件进行解剖,必须要有字节码文件对象.如何获取字节码文件对象呢

    获取字节码对象的第一种方式:Object类中的getClass()方法的。

    import com.itfd.fanshe.Person;
    
    public class ReflectDemo {
        public static void main(String[] args) {
            getClassObject();
        }
        
      public static void getClassObject(){
            
            Person p = new Person();
            Class clazz = p.getClass();
            
            Person p1 = new Person();
            Class clazz1 = p1.getClass();
            
            System.out.println(clazz==clazz1);
        }
    }

    想要用这种方式,必须要明确具体的类,并创建对象。比较麻烦 .

    获取字节码对象的第二种方式:任何数据类型都具备一个静态的属性.class来获取其对应的Class对象。

    import com.itfd.fanshe.Person;
    
    public class ReflectDemo {
        public static void main(String[] args) {
            getClassObject();
        }
        
        public static void getClassObject() {
            
            Class clazz = Person.class;
            
            Class clazz1 = Person.class;
            System.out.println(clazz==clazz1);
        }
    }

    相对简单,但是还是要明确用到类中的静态成员。这种方式还是不够扩展。

    获取字节码对象的第三种方式:只要通过给定的类的 字符串名称就可以获取该类,更为扩展。可是用Class类中的方法完成。该方法就是forName.

    public class ReflectDemo {
        public static void main(String[] args) throws ClassNotFoundException {
            getClassObject();
        }
        
        public static void getClassObject() throws ClassNotFoundException {
            
            String className = "com.itfd.fanshe.Person";
            
            Class clazz = Class.forName(className);
            
            System.out.println(clazz);
        }
    }

    这种方式只要有名称即可,更为方便,扩展性更强。

  • 相关阅读:
    [转] 你不知道的JavaScript和CSS交互的方法
    threejs学习笔记(9)
    把Mongodb配置成windows服务
    mongodb的一些基本操作
    DuiLib事件分析(一)——鼠标事件响应
    DuiLib学习bug整理——某些png不能显示
    DuiLib学习笔记5——标题栏不能正常隐藏问题
    DuiLib学习笔记4——布局
    DuiLib学习笔记3——颜色探究
    DuiLib学习笔记2——写一个简单的程序
  • 原文地址:https://www.cnblogs.com/LO-ME/p/3629598.html
Copyright © 2011-2022 走看看