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

 

反射

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

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

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

 

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

public class Person {
   private String name;
   int age;
   public String address;
 
   public Person() {
   }
 
   private Person(String name){
      this.name = name;
   }
 
   Person(String name, int age) {
      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
      Person p = new Person();
      Class c = p.getClass();
 
      Person p2 = new Person();
      Class c2 = 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
      Class c4 = Class.forName("day27.Person");
      System.out.println(c == c4);
   }
}
 
运行结果:
false
true
true
true


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值