Java运行时类反射

Java运行时类反射,java,class,Java,Class,假设我有一个名为Car的类,我可以在某些情况下使用下面的代码行 Car.class 我的问题是,如果用户在运行时提供类名,有没有一种方法可以进行相同类型的调用。我尝试过类似下面的东西,但没有乐趣,有没有办法做到这一点 String className = "Car"; Class.forName(className ).class; 此外,如果用户指定了需要动态强制转换的对象列表,我还需要能够动态强制转换 e、 g.代替Car myCar=(Car)对象 我需要能够让用户在运行时指定类的名称/

假设我有一个名为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”)
也将返回Class
Car
java.lang.Class
对象(假设Class
Car
在默认包中)。注意:无需附加
.class
;这将为您提供类
对象本身,这不是您想要的

Class
具有检查对象是否是
Class
实例表示的类的实例的方法(希望这不会太混乱…)。由于在编译时您不知道类
Car
的名称,因此不会有任何编译时类型安全性


查找
java.lang.Class
的API文档,表达式
Car.Class
返回类
Car
java.lang.Class
对象

语句
Class.forName(“Car”)
也将返回Class
Car
java.lang.Class
对象(假设Class
Car
在默认包中)。注意:无需附加
.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);
         }
      }
   }