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

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

posted @ 2014-03-27 22:36  胡椒粉hjf  阅读(1491)  评论(0编辑  收藏  举报