JAVA problem
登录 | 论坛导航 -> 华新鲜事 -> 社会百科 | 本帖共有 7 楼,分 1 页, 当前显示第 1 页 : 本帖树形列表 : 刷新 : 返回上一页
<<始页  [1]  末页>>
作者:百及子 (等级:5 - 略有小成,发帖:3259) 发表:2003-06-02 09:49:01  楼主  关注此帖
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了。

如果您知道,请讲仔细点好吗?谢谢


爱惜无俸禄 糟蹋有乾坤
欢迎来到华新中文网,踊跃发帖是支持我们的最好方法!原文 / 传统版 / WAP版只看此人从这里展开收起列表
作者:Flying (等级:18 - 华新水车,发帖:16849) 发表:2003-06-02 16:53:18  2楼 评分:
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.
欢迎来到华新中文网,踊跃发帖是支持我们的最好方法!原文 / 传统版 / WAP版只看此人从这里展开收起列表
作者:百及子 (等级:5 - 略有小成,发帖:3259) 发表:2003-06-02 16:59:39  3楼
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.
终於盼到希望了
不过想问一下:obj是Object,并不是我的MyClass,用obj来调用MyClass的method很显然找不到的,这个怎么办?如果还要用(MyClass)obj的话那岂不是还要hard coding?
欢迎来到华新中文网,踊跃发帖是支持我们的最好方法!原文 / 传统版 / WAP版只看此人从这里展开收起列表
作者:我心为谁动 (等级:3 - 略知一二,发帖:515) 发表:2003-06-02 20:30:29  4楼 评分:
终於盼到希望了不过想问一下:obj是Object,并不是我的MyClass,用obj来调用MyClass的method很显然找不到的,这个怎么办?如果还要用(MyClass)obj的话那岂不是还要hard coding?
你是要这样吗?
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的组合是没问题的, 不过其他的好像不可以。
欢迎来到华新中文网,踊跃发帖是支持我们的最好方法!原文 / 传统版 / WAP版只看此人从这里展开收起列表
作者:我心为谁动 (等级:3 - 略知一二,发帖:515) 发表:2003-06-02 20:46:03  5楼 评分:
你是要这样吗?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的组合是没问题的, 不过其他的好像不可以。
另一个办法, 有前提的
如果要调用的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();
...
...
...
欢迎来到华新中文网,踊跃发帖是支持我们的最好方法!原文 / 传统版 / WAP版只看此人从这里展开收起列表
作者:Flying (等级:18 - 华新水车,发帖:16849) 发表:2003-06-03 11:41:56  6楼
你是要这样吗?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的组合是没问题的, 不过其他的好像不可以。
No, not necessary.
Java reflection can handle normal method calls using generic reflection mechanism.
欢迎来到华新中文网,踊跃发帖是支持我们的最好方法!原文 / 传统版 / WAP版只看此人从这里展开收起列表
作者:百及子 (等级:5 - 略有小成,发帖:3259) 发表:2003-06-03 16:39:27  7楼
No, not necessary.Java reflection can handle normal method calls using generic reflection mechanism.
flying再来
我觉得 我心为谁动 的方法可行,至少我现在已经能顺利解决public+static的问题了

但是对於你的建议,还不是很明白,能给个简单的例子办到 我心为谁动 一样的效果吗?谢谢
欢迎来到华新中文网,踊跃发帖是支持我们的最好方法!原文 / 传统版 / WAP版只看此人从这里展开收起列表
论坛导航 -> 华新鲜事 -> 社会百科 | 返回上一页 | 本主题共有 7 篇文章,分 1 页, 当前显示第 1 页 | 回到顶部
<<始页  [1]  末页>>

请登录后回复:帐号   密码