Java——反射

Java不是动态语言,但有着一个非常突出的动态相关机制:Reflection,我们可以于运行时加载、探知、使用编译期间完全未知的classes。通过运行时才得知名称的class,可以获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

基本功能

在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外)。
所有类的对象其实都是Class的实例。

1、获取Class的三种方法

- 通过类的隐含class静态成员变量获取Class
- 通过类的实例对象,获取该类的Class
- 动态加载
Class c1 = AdultVideoStar.class;//通过类获取Class,任何一个类都有一个隐含的class静态成员变量。
        Class c2 = (new AdultVideoStar()).getClass();//通过类的实例对象,获取该类的Class。
        Class c3 = Class.forName("org.app.base.common.excel.AdultVideoStar");//动态加载(包名+类名)
        System.out.println(c1==c2);
        System.out.println(c2==c3);

【输出结果】

true
true

2、实例化对象

Class c3 = Class.forName("org.app.base.common.excel.AdultVideoStar");//动态加载(包名+类名)
AdultVideoStar av =(AdultVideoStar)c3.newInstance();
  • 行时动态加载的方式获取Class比较常用
  • c3.newInstance() 通过无参构造实例化对象,要求该类必须包含无参构造方法,否则将抛出异常。
  • c3.newInstance() 得到一个Object对象,需要强制转换

3、获取类的相关信息

这里写图片描述
如类名、构造方法、成员变量、方法名等

运用实例

动态工厂,相比普通工厂,更加通用,不用更改工厂类,只需要增加实现类即可。

public interface Games {
     public abstract void play();
}
public class LOL implements Games{

    @Override
    public void play() {
        // TODO Auto-generated method stub
         System.out.println("Legendary!");
    }

}
public class WOW implements Games{

    @Override
    public void play() {
        // TODO Auto-generated method stub
         System.out.println("Lok tar o'gar!");
    }

}
public class DynamicFactory {
    public static Games getInstance(String ClassName) {
        Games game = null;
        try {
            game = (Games) Class.forName(ClassName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return game;
    }

    public static void main(String[] a) throws FileNotFoundException,
            IOException {
        Games game = DynamicFactory.getInstance("org.app.base.common.study.reflection.WOW");
        if (game != null) {
            game.play();
        }
    }

}

【输出结果】

Lok tar o’gar!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值