Java 铸造负载类
我对类加载的概念还比较陌生,但我想尝试加载一个类并强制转换它 例如:Java 铸造负载类,java,eclipse,casting,classloader,Java,Eclipse,Casting,Classloader,我对类加载的概念还比较陌生,但我想尝试加载一个类并强制转换它 例如: public class foo { public void fah() { System.out.println("blah"); } } 现在我已经有了一个自定义类装入器,它返回一个类。如何将返回的类强制转换为“foo”,以便使用它的方法和变量。我见过类的getMethod()方法,这就是我应该使用的方法,而不是试图将其转换为Foo?如果加载该类,您将有反射内容来查找并调用具有所需参数的方
public class foo {
public void fah() {
System.out.println("blah");
}
}
现在我已经有了一个自定义类装入器,它返回一个类。如何将返回的类强制转换为“foo”,以便使用它的方法和变量。我见过类的getMethod()方法,这就是我应该使用的方法,而不是试图将其转换为Foo?如果加载该类,您将有反射内容来查找并调用具有所需参数的方法 如果加载该类,则需要查找反射内容,并使用所需参数调用该方法 您已加载该类,但需要实例化一个对象,以便能够将其作为foo访问
查看该类的Java API文档,特别是NewInstance()和getConstructor()方法,因为它们将是键。当您通过反射调用构造函数时,您将能够将结果强制转换为所需的类,然后将其视为任何其他foo实例。您已经加载了该类,但您需要实例化一个对象,以便能够将其作为foo访问
查看该类的Java API文档,特别是NewInstance()和getConstructor()方法,因为它们将是键。当您通过反射调用构造函数时,您将能够将结果强制转换为所需的类,然后将其视为具有默认构造函数的类的任何其他foo实例。。你必须这样做:
Class claz = Class.forName("com.a.b.C", true, classLoader);
Object[] paramObject = new Object[]{file};
Class<?>[]paramType = new Class[]{file.getClass()};
Method method = claz.getMethod("methodName", paramType);
method.invoke(claz.newInstance(), paramObject);
对于具有构造函数的类:
尝试使用getConstructor()
获取适当的构造函数和调用它的newInstace()
注意
在使用反射API时,请始终记住适当的类型。i、 e.
整数
!=<代码>int因为不存在自动装箱。对于具有默认构造函数的类。你必须这样做:
Class claz = Class.forName("com.a.b.C", true, classLoader);
Object[] paramObject = new Object[]{file};
Class<?>[]paramType = new Class[]{file.getClass()};
Method method = claz.getMethod("methodName", paramType);
method.invoke(claz.newInstance(), paramObject);
对于具有构造函数的类:
尝试使用getConstructor()
获取适当的构造函数和调用它的newInstace()
注意
在使用反射API时,请始终记住适当的类型。i、 e.
整数
!=int
因为不存在自动装箱。如果通过反射加载类,则是因为在编译时不知道实际的类,如注释中所示(在另一个答案中):
没有意义,因为您已经在类路径中静态访问了Foo,只需执行以下操作即可
Foo f = new Foo();
当您没有对类的静态绑定访问权限时,再次使用反射。(或者不知道你是否做)考虑:
定义为的类
public class Foo implements SomeInterface {
public void fah() {
System.out.println("blah");
}
}
现在通过反射访问这个Foo类,但将其作为SomeInterface
对象保留
Class c = loadClass("Foo");
SomeInterface i = (SomeInterface)c.newInstance();
这里我有一些由“Foo”实现的接口。我的代码是根据SomeInterface编译的,因此我可以引用接口中定义的方法,但除了名称之外,我不知道实现类“Foo”是什么。如果通过反射加载类,这是因为在编译时您不知道实际的类,如注释(另一个答案中)所示: 没有意义,因为您已经在类路径中静态访问了Foo,只需执行以下操作即可
Foo f = new Foo();
当您没有对类的静态绑定访问权限时,再次使用反射。(或者不知道你是否做)考虑:
定义为的类
public class Foo implements SomeInterface {
public void fah() {
System.out.println("blah");
}
}
现在通过反射访问这个Foo类,但将其作为SomeInterface
对象保留
Class c = loadClass("Foo");
SomeInterface i = (SomeInterface)c.newInstance();
这里我有一些由“Foo”实现的接口。我的代码是根据SomeInterface编译的,因此我可以引用接口中定义的方法,但除了名称之外,我不知道实现类“Foo”是什么;Foo=(Foo)c.newInstance()?是的,但是在“Foo”之后需要一个标识符,比如Foo f=(Foo)c.newInstance();要使其工作,类Foo必须有一个不带参数的构造函数。如果需要传递参数,则需要在类对象上使用getConstructor()或getConstructors()方法。非常感谢你!例如,c类=负载类(“someClass”);Foo=(Foo)c.newInstance()?是的,但是在“Foo”之后需要一个标识符,比如Foo f=(Foo)c.newInstance();要使其工作,类Foo必须有一个不带参数的构造函数。如果需要传递参数,则需要在类对象上使用getConstructor()或getConstructors()方法。非常感谢你!是的,我知道我有这个方法。invoke()路由我可以使用,但是我想知道是否可以直接强制转换它而不是添加额外的行。是的,我知道我有这个方法。invoke()路由我可以使用,但是我想知道是否可以直接强制转换它而不是添加额外的行。好的,如果我想得到一个字段的值,如何从claz.getField(“somefield”)创建的java.lang.reflect.Field对象中提取该值;好的,如果我想得到一个字段的值,我如何从claz.getField(“somefield”)创建的java.lang.reflect.field对象中提取该值;