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);
        }
    }

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

  • 相关阅读:
    spring详解(五)——事物管理
    spring详解(四)——JDBC
    spring详解(三)——AOP
    Spring详解(二)
    Spring详解(一)
    springMVC(九)——restful风格和异常处理
    Linux 文件权限
    如何使用Git从GitHub上下载项目
    Spring(1)
    SpringMvc(4)
  • 原文地址:https://www.cnblogs.com/LO-ME/p/3629598.html
Copyright © 2011-2022 走看看