码迷,mamicode.com
首页 > 其他好文 > 详细

反射概念:获取class文件对象的三种方式

时间:2016-05-12 22:22:49      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

 

反射

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

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

利用class文件对象,去使用该文件中的成员变量,构造方法,成员方法。

 

例子1:获取class文件对象的三种方式

public classPerson {

   private String name;

   int age;

   public String address;

 

   public Person() {

   }

 

   private Person(String name){

      this.name = name;

   }

 

   Person(Stringname, intage) {

      this.name = name;

      this.age = age;

   }

 

   public Person(String name, int age, String address) {

      this.name = name;

      this.age = age;

      this.address = address;

   }

 

   public void show() {

      System.out.println("show");

   }

 

   public void method(String s) {

      System.out.println("method "+ s);

   }

 

   public String getString(Strings, inti) {

      return s + "---" + i;

   }

 

   private void function() {

      System.out.println("function");

   }

 

   @Override

   public String toString() {

      return "Person [name="+ name+ ", age="+ age+ ", address=" + address

            +"]";

   }

 

}

 

/*

 * 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。

 *

 * Person p = new Person();

 * p.使用

 *

 * 要想这样使用,首先你必须得到class文件对象,其实也就是得到Class类的对象。

 * Class类:

 *    成员变量  Field

 *    构造方法  Constructor

 *    成员方法  Method

 *

 * 获取class文件对象的方式:

 * A:Object类的getClass()方法

 * B:数据类型的静态属性class

 * C:Class类中的静态方法

 *    publicstatic Class forName(String className)

 *

 * 一般我们到底使用谁呢?

 *    A:自己玩  任选一种,第二种比较方便

 *    B:开发第三种

 *        为什么呢?因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把这样的字符串配置到配置文件中。

 */

public classReflectDemo {

   public static void main(String[] args) throws ClassNotFoundException{

      // 方式1

      Personp = newPerson();

      Classc = p.getClass();

 

      Personp2 = newPerson();

      Classc2 = p2.getClass();

 

      System.out.println(p == p2);// false

      System.out.println(c == c2);// true

 

      // 方式2

      Classc3 = Person.class;

      // int.class;

      // String.class;

      System.out.println(c == c3);

 

      // 方式3

      // ClassNotFoundException

      Classc4 = Class.forName("day27.Person");

      System.out.println(c == c4);

   }

}

 

运行结果:

false

true

true

true

反射概念:获取class文件对象的三种方式

标签:

原文地址:http://blog.csdn.net/wangyanming123/article/details/51355213

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!