根据指定类名创建实例(Java的反射机制)

本文探讨了如何使用Java的反射机制来创建实例,包括无参数和带参数的情况。通过Class.forName获取类对象,然后使用newInstance()创建无参数实例。对于带参数的构造方法,使用getConstructor()指定参数类型,再调用newInstance()传入参数创建实例。最后,可以通过getMethod()获取方法并使用invoke()执行实例方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在用网络编程做一个小型服务器,在做映射这一块时遇到一个小问题:获得handler后如何跳到对应的类中执行,即如何根据类名创建实例。

这里有两种形式:带参数和不带参数,下面是我的理解,是否完全正确有待考证:

1.对于不带参数的情况,首先得到该类的Class对象,再调用newInstance方法即可得到空参数列表的实例,即:

Class c = Class.forName(className);//注意传进来的是完全限定名,即带上包名等

c.newInstance();

2.若要创建带参数的实例,则需要在得到该类的Class对象后,获得一个构造器,方法为Class.getConstructor(Class...parameterTypes),例如Class.getConstructor(String.class,OutputStream.class),表示一个参数列表类型为(String,OutputStream)的构造方法,返回值为java.lang.reflect.Constructor,此类中有方法newInstance(Object...parameters),即对此构造器传参数,得到对应的实例,下面是创建handler包中的一个类IndexHandler实例的例子,其中在IndexHandler类中有一构造方法为public IndexHandler(OutputStream outputStream,String request):

			Class c = Class.forName("handler."+handler);
			java.lang.reflect.Constructor constructor = c.getConstructor(OutputStream.class,String.class);//顺序不可变
			constructor.newInstance(outputStream,str);

由于返回值属于泛型,所以若不知道类的具体类名,是不能直接用其调用类中的方法的,如上例中不能用constructor.newInstance(outputStream,str).function();若要调用类中方法,可以用Class.getMethod或getMethods方法,其返回值类型为Method,也是java.lang.reflect中的类,再调用方法invoke即可,具体例子如下:

Class<?> c = Class.forName(className);

Constructor<?> constructor = c.getConstructor(String.class); //假设类有一构造器className(String name)
Object o = constructor.newInstance("zhengjunyan"); //相当于new className("zhengjunyan")

Method method = c.getMethod("test",String.class); //假设类中有一个方法test(String s)
method.invoke(o,"zheng"); //即调用已创建的实例的方法test("zheng")

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值