Java运行时类反射
假设我有一个名为Car的类,我可以在某些情况下使用下面的代码行Java运行时类反射,java,class,Java,Class,假设我有一个名为Car的类,我可以在某些情况下使用下面的代码行 Car.class 我的问题是,如果用户在运行时提供类名,有没有一种方法可以进行相同类型的调用。我尝试过类似下面的东西,但没有乐趣,有没有办法做到这一点 String className = "Car"; Class.forName(className ).class; 此外,如果用户指定了需要动态强制转换的对象列表,我还需要能够动态强制转换 e、 g.代替Car myCar=(Car)对象 我需要能够让用户在运行时指定类的名称/
Car.class
我的问题是,如果用户在运行时提供类名,有没有一种方法可以进行相同类型的调用。我尝试过类似下面的东西,但没有乐趣,有没有办法做到这一点
String className = "Car";
Class.forName(className ).class;
此外,如果用户指定了需要动态强制转换的对象列表,我还需要能够动态强制转换
e、 g.代替Car myCar=(Car)对象
我需要能够让用户在运行时指定类的名称/类型,以便我能够按照
ClassName myObj=(ClassName)object
的思路进行操作。鉴于问题的性质,对这一问题的大多数回答都直接来自反射API文档。我建议你看看这个:。如果这没有帮助,并且您需要一些特定的帮助,我们可以看看。鉴于问题的性质,对这一问题的大多数回答都直接来自反射API文档。我建议你看看这个:。如果这没有帮助,您需要一些特定的帮助,我们可以看看。您希望与myObj交互,因此,与其进行这些练习,不如考虑添加一个接口来模拟您希望与对象的交互,然后在代码中使用该接口。然后,可以验证用户提供的类以实现必要的接口,并适当地引发错误。您希望与myObj交互,因此,与其进行这些练习,不如考虑添加一个接口来模拟您希望与对象的交互,然后在代码中使用该接口。然后可以验证用户提供的类以实现必要的接口,并相应地引发错误。Class.forName(“Car”)
已返回与Car.Class
相同的结果
对于强制转换,您可以使用Class.forName(“Car”).cast(object)
,它将返回一个Car
对象。看看API,主要是它的java.lang.Class
部分
此外,由于您正在强制转换@runtime,因此没有类型安全性,在执行此操作之前,您应该检查object
是否扩展或实现了Car
,否则会出现异常。也可能与您相关
虽然,正如其他人已经说过的,这很有味道&你可能可以用更好的方式重新设计它,也要注意,这种类型的转换通常会非常慢,因为Java需要检查类型层次结构(如果它不能转换到Car
,它需要抛出ClassCastException
)。Class.forName(“Car”)
已返回与Car.class
相同的值
对于强制转换,您可以使用Class.forName(“Car”).cast(object)
,它将返回一个Car
对象。看看API,主要是它的java.lang.Class
部分
此外,由于您正在强制转换@runtime,因此没有类型安全性,在执行此操作之前,您应该检查object
是否扩展或实现了Car
,否则会出现异常。可能也与您有关
虽然,正如其他人已经说过的,这很有味道&你可能可以用更好的方式重新设计它,还注意,这种类型的转换通常会非常慢,因为Java需要检查类型层次结构(如果它不能转换到
汽车
,它需要抛出一个ClassCastException
).表达式Car.class
返回类Car
的java.lang.class
对象
语句Class.forName(“Car”)
也将返回ClassCar
的java.lang.Class
对象(假设ClassCar
在默认包中)。注意:无需附加.class
;这将为您提供类类类对象本身,这不是您想要的
类Class
具有检查对象是否是Class
实例表示的类的实例的方法(希望这不会太混乱…)。由于在编译时您不知道类Car
的名称,因此不会有任何编译时类型安全性
查找java.lang.Class
的API文档,表达式Car.Class
返回类Car
的java.lang.Class
对象
语句Class.forName(“Car”)
也将返回ClassCar
的java.lang.Class
对象(假设ClassCar
在默认包中)。注意:无需附加.class
;这将为您提供类类类对象本身,这不是您想要的
类Class
具有检查对象是否是Class
实例表示的类的实例的方法(希望这不会太混乱…)。由于在编译时您不知道类Car
的名称,因此不会有任何编译时类型安全性
查找java.lang.Class
的API文档,您要查找的是java编程语言中名为反射的功能
它允许一个正在执行的Java程序对自身进行检查或“内省”,并操作程序的内部属性。例如,Java类可以获取其所有成员的名称并显示它们
一个简单的例子来自
输出为:
public java.lang.Object java.util.Stack.push(
java.lang.Object)
public synchronized
java.lang.Object java.util.Stack.pop()
public synchronized
java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized
int java.util.Stack.search(java.lang.Object)
以下是在运行时创建对象的示例:
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);
}
}
}
你可以阅读更多关于它和
请看这里:
您正在寻找的是Java编程语言中一种称为反射的功能。 public java.lang.Object java.util.Stack.push(
java.lang.Object)
public synchronized
java.lang.Object java.util.Stack.pop()
public synchronized
java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized
int java.util.Stack.search(java.lang.Object)
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);
}
}
}