登录 | 首页 -> 华新鲜事 -> 社会百科 | 切换到:传统版 / sForum | 树形列表
JAVA problem
<<始页  [1]  末页>> 

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楼


<<始页  [1]  末页>> 
登录 | 首页 -> 华新鲜事 -> 社会百科 | [刷新本页] | 切换到:传统版 / sForum