JAVA problem哪位大侠讲讲java.lang.Class和java.lang.ClassLoader怎么用的?
我主要想用一个string表示的名字来调用同名的一个class,不知道上面两个class能否做到这点?即
string temp = "MyClass";
public class MyClass{
public static void testmethod(){
System.out.println("Test OK");
}
}
问题要求我如何把temp提交给java.lang.Class或java.lang.ClassLoader然后返回MyClass,这样就可以直接调用testmethod了。
如果您知道,请讲仔细点好吗?谢谢[百及子 (6-2 9:49, Long long ago)]
[ 传统版 |
sForum ][登录后回复]1楼
Some points here:1) You don't normally make direct use of ClassLoader, unless you wanna customize the security/access/initialization mechanism of the default class loaders provided.
2) To use java.lang.Class to load a class, simple do this:
try {
Class cls = Class.forName("MyClass");
Object obj = cls.newInstance();
} catch (....) {
}
//There is a long list of possible exceptions here. Check JDK API doc for the list.[Flying (6-2 16:53, Long long ago)]
[ 传统版 |
sForum ][登录后回复]2楼
(引用 Flying:Some points here:1) You don't normally make direct use of ClassLoader, unless you wanna customize the security/access/initializa...)终於盼到希望了不过想问一下:obj是Object,并不是我的MyClass,用obj来调用MyClass的method很显然找不到的,这个怎么办?如果还要用(MyClass)obj的话那岂不是还要hard coding?[百及子 (6-2 16:59, Long long ago)] [ 传统版 | sForum ][登录后回复]3楼
(引用 百及子:终於盼到希望了不过想问一下:obj是Object,并不是我的MyClass,用obj来调用MyClass的method很显然找不到的,这个怎么办?如果还要用(MyC...)你是要这样吗?File Name: Test.java
--------------------------------------------
import java.io.*;
import java.lang.reflect.Method;
public class Test
{
public static void main(String args[]) throws Exception
{
new Test(args[0], args[1]);
}
public Test (String className, String methodName) throws Exception
{
Class c = Class.forName(className);
Method m = c.getMethod(methodName, null);
m.invoke(this, null);
}
}
File Name: MyClass1.java
-----------------------------
public class MyClass1
{
public static void testMethod ()
{
System.out.println("My Name is MyClass1");
}
}
File Name: MyClass2.java
----------------------------
public class MyClass2
{
public static void testMethod ()
{
System.out.println("My Name is MyClass2");
}
}
以上code, 运行结果如下
>>java Test MyClass1 print
>>My Name is MyClass1
>>java Test MyClass2 print
>>My Name is MyClass2
不过这个里面的modifier和static keyword好像有要求, 以上public+static的组合是没问题的, 不过其他的好像不可以。[我心为谁动 (6-2 20:30, Long long ago)]
[ 传统版 |
sForum ][登录后回复]4楼
(引用 我心为谁动:你是要这样吗?File Name: Test.java
--------------------------------------------
import java.io.*;
import java.lang.reflect.Metho...)另一个办法, 有前提的如果要调用的class们有相同的method, 如public static void print(), 一般来说这些class都是某一个parent class的children,
并且这些class的总数不多, 可以如下办
设class们是 Child1, Child2, Child3..., parent class is Parent, method是print,
Parent anObject = however_you_created_it;
if (anObject instanceof Child1)
Child1.print();
else if (anObject instanceof Child2)
Child2.print();
...
...
...
[我心为谁动 (6-2 20:46, Long long ago)]
[ 传统版 |
sForum ][登录后回复]5楼
(引用 我心为谁动:你是要这样吗?File Name: Test.java -------------------------------------------- import java.io.*; import java.lang.reflect.Metho...)No, not necessary.Java reflection can handle normal method calls using generic reflection mechanism.[Flying (6-3 11:41, Long long ago)] [ 传统版 | sForum ][登录后回复]6楼
(引用 Flying:No, not necessary.Java reflection can handle normal method calls using generic reflection mechanism.)flying再来我觉得 我心为谁动 的方法可行,至少我现在已经能顺利解决public+static的问题了
但是对於你的建议,还不是很明白,能给个简单的例子办到 我心为谁动 一样的效果吗?谢谢[百及子 (6-3 16:39, Long long ago)]
[ 传统版 |
sForum ][登录后回复]7楼