反射机制的简单理解-Class类

本文深入解析Java反射机制,介绍如何动态获取类实例、属性及方法,演示反射在实例创建、属性操作和方法调用的应用,并对比公有和私有成员的获取差异。

理论点:首先我们在平时编程过程中,经常会去获得实例对象。 

               new一个对象,是我们常用的方法。

               所以,每次我们需要一个对象实例的时候就需要提前编译,这就带有局限性。

               那我们可不可以在需要用到的时候再去创建这个类呢,而且还可以只需要其中的一个方法或者一个属性。

               那么,反射机制是可以做到这点的,而动态生成正是反射的最大的实用点。

               我们可通过类对象的方法获取类实例,也可获取类方法、变量等。        

常用方法:

               1、Class类:代表一个类

               2、Field类:代表类的成员变量(类的属性)

               3、Method类:代表类的方法

               4、Constructor类:代表类的构造方法

               5、Array类:提供了动态创建数组,以及访问数组的元素的静态方法

实例创建:

类:

package moBanClass;

public class Hero {	
    //定义变量
    public String name;
    public int age;
    public String sex;
    //私有变量
    private String money;

    //共有方法
    public void showName() {
       System.out.println("My Name Is LinDa~");
    }
    //私有方法
    private void showMoney() {
       System.out.println("No Money!");
    }
}

获取类对象:

//首先获取类对象,有4种方式 

1.Class class=Hero.class;

2.Class class=Class.forName("moBanClass.Hero");
		
3.Class<Hero> class=new Hero().getClass();----//非经常使用,毕竟都有了对象还反射干嘛

//前三种无需获得Class类对象,但是ClassLoader则需要先获得ClassLoader对象

4.Class<Hero> class=ClassLoader.getSystemClassLoader().loadClass("moBanClass.Hero");

获取实例对象:

//获取类构造器
Constructor c= class.getConstructor();

//new一个实例
Hero hero =c.newInstance();

亦可:
Hero hero= Hero.class.getConstructor().newInstance();

也可直接获取属性变量:

但是得注意此处所用的方法:
1.Field[]  getFields(null   /  String fieldName):获取  所有的/某一个 "公有字段"。
2.Field[]  getDeclaredFields(null  /  String fieldName):获取  所有的/某一个字段,公共或私有皆可。

//类对象
Class<Hero> clazz=Hero.class;
//实例对象
Hero hero=clazz.getConstructor().newInstance();
		
//获取name属性
Field fieldName=clazz.getField("name");
fieldName.set(hero, "panda");
System.out.println(hero.name);          
-------------------------------------	
 //hero.name=panda
	
//获取所有公共属性
Field[] fields=clazz.getFields();
    for (Field field : fields) {
	System.out.println(field);            
    }
-------------------------------------
//field:
  public java.lang.String moBanClass.Hero.name
  public int moBanClass.Hero.age
  public java.lang.String moBanClass.Hero.sex
		
//获取所有公共或私有属性
Field[] fields2=clazz.getDeclaredFields();
    for (Field field2 : fields2) {
	System.out.println(field2);
    }
-------------------------------------
//field:
  public java.lang.String moBanClass.Hero.name
  public int moBanClass.Hero.age
  public java.lang.String moBanClass.Hero.sex
  private java.lang.String moBanClass.Hero.money

同样,也可以利用反射获取方法,但是此处一样需要注意

1.public Method[] getMethods(String name,Class<?>... parameterTypes):获取所有"公有方法"。

2. public Method[] getDeclaredMethods(String name,Class<?>... parameterTypes):获取所有的成员方法,包括私有的(不包括继承的)。

同样也可以只获取单个方法。

//获取showName方法
Method method=clazz.getMethod("showName");
method.invoke(hero);
-------------------------------------
//My Name Is LinDa~
		
//获取所有公共方法
Method[] methods=clazz.getMethods();
for (Method method2 : methods) {
    System.out.println(method2);
}
-------------------------------------
//public void moBanClass.Hero.showName()

//获取所有公共或私有方法
Method[] methods2=clazz.getDeclaredMethods();
for ( Method method2 : methods2) {
    System.out.println(method2);
}
//public void moBanClass.Hero.showName()
//private void moBanClass.Hero.showMoney()

以上就是反射常用的一些方法,具体的要用的方法可去API查询~增强理解~

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值