- 论坛徽章:
- 0
|
反射-REFLECTION
具体的应用:
1、 模仿instanceof 运算符号
public class TestA {
}
public class Test01 {
public static void main(String args[]) {
try {
Class cls = Class.forName("TestA");
boolean b1 = cls.isInstance(new Integer(37));
System.out.println(b1);
boolean b2 = cls.isInstance(new TestA());
System.out.println(b2);
} catch (Throwable e) {
System.err.println(e);
}
}
}
console
falsetrue
2、 在类中寻找指定的方法,同时获取该方法的参数列表,例外和返回值
import java.lang.reflect.*;
public class method1 {
private int func1(Object p, int x) throws NullPointerException {
if (p == null)
throw new NullPointerException();
return x;
}
public static void printMethod1Info(String mn) {
try {
Class cls = Class.forName(mn);
Method methlist[] = cls.getDeclaredMethods();
for (int i = 0; i
console
name= maindecl class = class method1paramters 0Type: class [Ljava.lang.String;------------------name= func1decl class = class method1paramters 0Type: class java.lang.ObjectException 0: class java.lang.NullPointerExceptionreturn type = int------------------paramters 1Type: intException 0: class java.lang.NullPointerExceptionreturn type = int------------------
3、 获取类的构造函数信息,基本上与获取方法的方式相同
import java.lang.reflect.Constructor;
public class constructorA {
public constructorA() {
}
protected constructorA(int i, double d) {
}
private constructorA(String arg0, String arg1, Object obj) {
}
public static void main(String args[]) {
try {
Class cls = Class.forName("constructorA");
Constructor ctorlist[] = cls.getDeclaredConstructors();
for (int i = 0; i console
name= constructorAdecl class = class constructorAparam #0 intparam #1 double-----name= constructorAdecl class = class constructorAparam #0 class java.lang.Stringparam #1 class java.lang.Stringparam #2 class java.lang.Object-----name= constructorAdecl class = class constructorA-----
4、 获取类中的各个数据成员对象,包括名称。类型和访问修饰符号
import java.lang.reflect.*;
public class field1 {
private double d;
public static final int i = 37;
String s = "testing";
public static void main(String args[]) {
try {
Class cls = Class.forName("field1");
Field fieldlist[] = cls.getDeclaredFields();
for (int i = 0; i console
name= ddecl class = class field1type= doublemodifiers = private-----name= idecl class = class field1type= intmodifiers = public static final-----name= sdecl class = class field1type= class java.lang.Stringmodifiers = -----
5、 通过使用方法的名字调用方法
import java.lang.reflect.*;
public class method2 {
public int add(int a, int b) {
return a + b;
}
public static void main(String args[]) {
try {
Class cls = Class.forName("method2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Method meth = cls.getMethod("add", partypes);
method2 methobj = new method2();
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
System.out.println(retval.intValue());
} catch (Throwable e) {
System.err.println(e);
}
}
}
console
84
6、 创建新的对象
import java.lang.reflect.*;
public class constructor2 {
public constructor2()
{
}
public constructor2(int a, int b)
{
System.out.println(
"a = " + a + " b = " + b);
}
public static void main(String args[])
{
try {
Class cls = Class.forName("constructor2");
Class partypes[] = new Class[2];
partypes[0] = Integer.TYPE;
partypes[1] = Integer.TYPE;
Constructor ct
= cls.getConstructor(partypes);
Object arglist[] = new Object[2];
arglist[0] = new Integer(37);
arglist[1] = new Integer(47);
Object retobj = ct.newInstance(arglist);
}
catch (Throwable e) {
System.err.println(e);
}
}
}console
a = 37 b = 47
7、 变更类实例中的数据的值
package com.shaw.mvctest.control;
import java.lang.reflect.*;
public class field2 {
public double d;
public static void main(String args[]) {
try {
Class cls = Class.forName("com.shaw.mvctest.control.field2");
Field fld = cls.getField("d");
field2 f2obj = new field2();
System.out.println("d = " + f2obj.d);
fld.setDouble(f2obj, 12.34);
System.out.println("d = " + f2obj.d);
} catch (Throwable e) {
System.err.println(e);
}
}
}
console
d = 0.0d = 12.34
使用反射创建可重用代码:
1、 对象工厂
public class ObjectFoundry {
public static Object factory(String p)
throws
ClassNotFoundException,
InstantiationException,
IllegalAccessException {
Class c = Class.forName(p);
Object o = c.newInstance();
return o;
}
}
2、 动态检测对象的身份,替代instanceof
public class ObjectFoundry {
public static boolean isKindOf(Object obj, String type)
throws ClassNotFoundException {
// get the class def for obj and type
Class c = obj.getClass();
Class tClass = Class.forName(type);
// check against type and superclasses
while (c != null) {
// have we found the given classname?
if (c == tClass)
return true;
c = c.getSuperclass();
}
return false;
}
}
Reflection and the Factory Design Pattern(反射和工厂设计模板)
public class beanFactory {
public static Object getObject(String classname, Class requiredType)
throws Exception {
try {
Class clazz = Class.forName(classname);
Object o = clazz.newInstance();
if (!requiredType.isAssignableFrom(clazz))
throw new Exception(
"Class "
+ classname
+ "not of required type "
+ requiredType);
return o;
} catch (IllegalAccessException ex) {
throw new Exception(
"Couldn't construct class "
+ classname
+ ": is the no arg constructor public ");
}
}
}
MyInterface mo = (MyInterface)
beanFactory.getObject("com.mycompany.mypackage.MyImplementation",
MyInterface.class);
*最后一个非常实用的例子,利用反射机制的Constructor创建一个实例--createJavaObject;利用反射中的Method动态实现方法--executeJavaMethod,注意对于反射方法输入的类型描述一定是全力路径的,如 java.lang.String而不能是String
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Invokertester {
private static Object createJavaObject(
String className,
List paramClassList,
List paramValueList)
throws Exception {
try {
if (className == null || className.length() == 0)
throw new ClassNotFoundException("var className name can't be null");
paramClassList =
((List) (paramClassList != null
? paramClassList
: ((List) (new ArrayList()))));
paramValueList =
((List) (paramValueList != null
? paramValueList
: ((List) (new ArrayList()))));
if (paramClassList.size() != paramValueList.size())
throw new IllegalArgumentException(
"Declared type is"
+ paramClassList.size()
+ "Not qual to paramters passed in "
+ paramValueList.size());
Class paramClassArry[] = new Class[paramClassList.size()];
for (int i = 0; i paramClassList.size ["
+ paramClassList.size()
+ "] != paramValueList.size ["
+ paramValueList.size()
+ "]");
Class paramClassArry[] = new Class[paramClassList.size()];
for (int i = 0; i " + cnfe.getMessage());
} catch (IllegalAccessException iae) {
iae.printStackTrace(System.out);
throw new Exception("2:executeJavaMethod->" + iae.getMessage());
} catch (InvocationTargetException ite) {
ite.printStackTrace(System.out);
throw new Exception("3:executeJavaMethod->" + ite.getMessage());
} catch (NoSuchMethodException nme) {
nme.printStackTrace(System.out);
throw new Exception("4:executeJavaMethod->" + nme.getMessage());
}
}
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/16182/showart_106964.html |
|