RTTI与反射

  • RTTI:
    运行期类型鉴定。在编译期通过载入和检查.class文件,从而鉴定类型。
  • 反射:
    运行期类信息。应用场景:反序列化,远程调用(RM),访问私用变量和方法。编译期.class文件不可用,只能在运行期获得.class文件,在运行期载入和检查.class文件。

1.RTTI:

1
2
3
4
5
6
7
8
//RTTI的例子:
if(boolean.class==Boolean.TYPE)
System.out.println("boolean true");
Gun gun=new Gun();
if//(Gun.class.isInstance(gun))//方式1;
(Class.forName("test1.RTTI$Gun").isInstance(gun ))//方式2反射。
System.out.println("gun is instance of Gun");
//此处Gun是test1包下RTTI类中的一个内部类。

2.反射:
http://blog.csdn.net/stevenhu_223/article/details/9286121

1
2
3
4
5
6
7
8
9
10
11
12
Class<?> class1 = Class.forName("test1.RTTI$Gun");
Method[] methods = class1.getMethods();
for (Method method : methods)
out.println(method);
out.println("constructos:--");
Constructor[] constructors=class1.getConstructors();
for (Constructor method : constructors)
out.println(method);
Method me1=class1.getMethod("getdata", int.class);
Type returnType=me1.getReturnType();
Object output=me1.invoke(class1.newInstance(),3);
out.println(output);

getFields方法获取所有public属性;
getDeclaredFields方法获取所有属性,包括private
getMethods方法获取所有public方法;
getDeclaredMethods方法获取所有方法,包括private

可通过getDeclaredMethods获取私有方法;
然后nameMethod.setAccessible(true);
然后就可以执行private方法了。

此外,获取方法时,除了指定方法名,还要指定参数类型列表,多个参数时可这样写:

1
2
Class<?> clazz=Gun.class;
Method allValuesMethod = clazz.getDeclaredMethod("setAllValues", new Class[]{String.class, int.class, float.class});

推荐文章