Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 铸造负载类_Java_Eclipse_Casting_Classloader - Fatal编程技术网

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对象中提取该值;