设为首页收藏本站
机战Z2破界篇 星组汉化 下载

星组游戏论坛

 找回密码
 注册(QQ注册+邀请注册)

QQ登录

只需一步,快速开始

查看: 860|回复: 2

[心得] Java反射机制 [复制链接]

Rank: 11Rank: 11Rank: 11Rank: 11

UID
98178
星币
61
积分
24
阅读权限
90
注册时间
2013-4-11
最后登录
2015-10-29
发表于 2013-5-24 11:08:09 |显示全部楼层
问题:可不可以在不修改源码的基础上运行后期出现的子类对象呢?

解答:可以!只要在前期设计时,将后期指定的类进行对象的建立,这样后期的子类对象就不 需要再建立对象,只要将子类名称告知即可。

为了获取后期对象,并在前期可以使用,或对外提供了一个配置文件。前期程序可以直接操 作该配置文件,后期的子类只需要将子类名称存入配置文件即可。

这时就需要动态的获取指定的类并预先创建对象

( d% R2 U( B2 T

利用Class类来动态加载一个类:

一个简单的例子:(通过配置文件动态加载一个子类)

class Test{

     public static void main (string [ ] args){

         File file = new File(“ate.txt”);

         BufferenReader buff = new BufferenReader(new FileReader(file));

         String className = buff.readLine();

         Class cla = Class.forName(className);

         Tc p = (Tc)cla.newInstance();

         p.test();

        }

}

( Z- U8 d2 t  M% T8 s( G

配置文件ate.txt :存入给子类的全名。


# @/ H- D/ ]+ t  u; }6 g& A1 m0 R6 _& ?5 g' H; M8 _+ ]6 n

获得Class对象的三种方式:

1. 调用某个对象的getClass()方法

例:  Test t = new Test();

          Class cla = t.getclass();

2. 调用某个类的class属性来获取该类对应的Class对象

例:  Class cla = Test.class;

3. 使用Class类的forName()静态方法

例:  Class cla = class.forName(“ com.zh.sparta.Test”);

以上三种方式前两种都是要在编译前就知道类的名字,而第三种方式是往forName方法里面传入一个类的全名(全名即包括完整的包名),这种方式可以在程序运行时才去获取某个类的信息。

& V5 E8 s2 @$ j. K( G& a9 p

Class常用方法:(Class[] params Class对象中方法对应的一个或一个以上的参数 例:有两个参数  getMethod(“tests”,Stting.class,int.class)

1. Constructor getConstructor(Class[] params);   ——   返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。

2. Constructor[] getConstructors(); —— 返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

3. Constructor getDeclaredConstructor(Class[] params); ——  返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。

4. Method[] getDeclaredConstructors() ; —— 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。

5. Method getMethod(String name , Class[] params);   ——   返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。

6. Method[] getMethods(); ——  返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

7. Method getDeclaredMethod(String name,Class[] params); —— 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。

8. Method[] getDeclaredMethods(); ——    返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

9. Field getField(String name); —— 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。

10. Field[] getFields();   ——  返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

11. Field getDeclaredField(String name); ——  返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。

12. Field[] getDeclaredFields(); ——   返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。

13. <A extends Annotation>A getAnnotation(Class<A> annotationClass); ——  如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null

14. Annotation[] getAnnotations(); ——    返回此元素上存在的所有注释。

15. Annotation[] getDeclaredAnnotations(); ——  返回直接存在于此元素上的所有注释。

16. Class[] getDeclareClasses(); —— 返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口。

17. Class[] getDeclaringClass(); —— 如果此 Class 对象所表示的类或接口是另一个类的成员,则返回的 Class 对象表示该对象的声明类。

18. int getModifiers(); —— 返回此类或接口以整数编码的 Java 语言修饰符。

19. Class[] getInterfaces(); —— 确定此对象所表示的类或接口实现的接口。

20. Package getpackage(); —— 获取此类的包。

21. String getName(); ——  以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

22. String getSimpleName(); —— 返回源代码中给出的底层类的简称。

23. Class getSuperclass(); —— 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

24. T newInstance(); —— 创建此 Class 对象所表示的类的一个新实例。

2 u- j3 B; H3 w4 {

2 @' v1 x2 _3 j* D# f  h
) \# A$ v9 D' l( Z

Rank: 4

UID
97095
星币
580
积分
422
阅读权限
40
注册时间
2013-2-17
最后登录
2014-4-12
发表于 2013-5-24 13:32:32 |显示全部楼层
哇、汉化大人支持你!!!!果然是很有爱、、、太伟大了
头像被屏蔽

禁止发言

UID
115225
星币
59
积分
350
阅读权限
0
注册时间
2016-7-25
最后登录
2017-10-24
发表于 2016-9-2 21:03:02 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

Archiver|星组游戏论坛 ( 京公网安备110403080002 )  

GMT+8, 2017-11-20 19:40

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部