免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1077 | 回复: 0
打印 上一主题 下一主题

JAVA Reflection code example [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-30 01:05 |只看该作者 |倒序浏览

               
               
               
               
               
         反射-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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP