如何反射机制来动态实现化class? Class cc = Class.forName("ClassA");//不一定正确差不多的一个方法名字cc.invoke("setRkey",...);差不多是这个样子查阅一下手册总之是调用这个cc的方法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class Assistant { public static final String CLASSA= "classA"; public static Object create(String str) {////////////返射机制的方法 Object cf=null; try { cf = (Object)Class.forName(str).newInstance(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (IllegalAccessException ex) { ex.printStackTrace(); } catch (InstantiationException ex) { ex.printStackTrace(); } return cf; }调用:classA cc=(classA)Assistant.create(Assistant.CLASSA);cc.setRkey(rkey);cc.getRkey(); 呵呵,java上我也是新手所以只能给个提示啦。 To:qiang029(风)你这里是针对ClassA的吧,如果我也想让以下代码适合ClassB,怎么办?classA cc=(classA)Assistant.create(Assistant.CLASSA);cc.setRkey(rkey);cc.getRkey();谢谢! 变通一下就可以呵,把下句的"classA"变成classB就可以。 public static final String CLASSA= "classA"; 在Assistant 类里面加一个属性public static final String CLASSB= "classB";还是这么调用classB cd=(classB)Assistant.create(Assistant.CLASSB);cd.setRkey(rkey);cd.getRkey();想做一个类就加一个属性就行了 可能我没有将意思说清楚。我想处理ClassA与ClassB共用一段代码。classB cd=(classB)Assistant.create(Assistant.CLASSB);cd.setRkey(rkey);cd.getRkey(); interface GetRKey{ public long getRkey(); public void setRkey(long rkey);}public class ClassA implements GetRKey{ private long Rkey; public long getRkey() { return Rkey; } public void setRkey(long rkey) { this.Rkey = rkey; } }public class ClassB implements GetRKey{ private long Rkey; public long getRkey() { return Rkey; } public void setRkey(long rkey) { this.Rkey = rkey; } }public class Main{ public static void main(String[] args){ //实现ClassA的功能 GetRKey myKey = (GetRKey)Class.forName("ClassA").newInstance(); myKey.setRkey(123); myKey.getRkey(); //实现ClassB的功能 GetRKey myKey = (GetRKey)Class.forName("ClassB").newInstance(); myKey.setRkey(321); myKey.getRkey(); }}不知合不合要求 看看下面的例子能不能给大家点启发?如果有问题共同讨论[email protected]例子演示了这一实现。 -|Base.java //抽象基类 |Son1.java //基类扩展1 |Son2.java //基类扩展2 |Util.java /** * @author metaphy * create 2005-4-14 9:06:56 * 说明: */ (1)Base.java 抽象基类只是一个定义 public abstract class Base { } (2)Son1.java /Son2.java 是已经实现的JavaBean public class Son1 extends Base{ private int id ; private String name ; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void son1Method(String s){ System.out.println(s) ; } } (3) public class Son2 extends Base{ private int id; private double salary; public int getId() { return id; } public void setId(int id) { this.id = id; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } } (4)Util.java 演示了如何根据指定的类名,类字段名和所对应的数据,得到一个类的实例 import java.lang.reflect.Method; public class Util { //此方法的最大好处是没有类名Son1,Son2 可以通过参数来指定,程序里面根本不用出现 public static Base convertStr2ServiceBean(String beanName,String fieldSetter,String paraValue){ Base base = null ; try { Class cls = Class.forName(beanName) ; base = (Base)cls.newInstance() ; Class[] paraTypes = new Class[]{String.class }; Method method = cls.getMethod(fieldSetter, paraTypes) ; String[] paraValues = new String[]{paraValue} ; method.invoke(base, paraValues) ; } catch (Throwable e) { System.err.println(e); } return base ; } public static void main(String[] args){ Son1 son1 =(Son1) Util.convertStr2ServiceBean("trying.reflect.Son1","setName","wang da sha"); System.out.println("son1.getName() :"+son1.getName()) ; } } //调用结果: //son1.getName() :wang da sha 谢谢!希望能给大家一点启发! 谢谢各位讨论。To:btb8668 你这里已经基本上满足我的要求了。 再请问:如果我调用的方法是没有参数的方法,怎么办?method.invoke(base, paraValues) ; ==>改成:method.invoke(base, null) ;为何不行? 再请问:如果我调用的方法是没有参数的方法,怎么办?method.invoke(base, paraValues) ; ==>改成:method.invoke(base, null) ;为何不行?在查找方法的时候,也要Method method = cls.getMethod(fieldSetter, null) ; 方法method.invoke()的参数要求是Object obj, Object...args。我的问题是如果setter里的变量是内置基本类型,例如int,double怎么办。我试了用wrapper类,如Integer,Double,好像不行,因为传过去的仍然是Object类,不是基本类型,会抛出java.lang.NoSuchMethedException异常。请各位DX指教。 我的代码如下:Object[] paraValues = new Long[]{new Long(value)};method.invoke(instance, paraValues);结果如下:java.lang.NoSuchMethodException: ClassA.setKey(java.lang.Long) form表单中action绝对路径/现对路径 你目前在自学什么技术? session 这个对象 spring2.0下配置jndi遇到的很棘手的问题,特急!! java 权限设置 想问个关于四则运算和位运算的问题。 高手进~ 哪位仁兄那有用java实现的ftp连接其中包括上传下载文件和文件列表, 及获得文件后缀和后缀列表 请帮个忙 小弟感激不尽 简单STRUTS代码是什么功能? 对已应用之间的调用,如何选择rpc还是mq? Struts中<html:radio>的一个问题 Tomcat的问题高手帮忙 关于IE浏器无法提交登陆信息的问题
public static final String CLASSA= "classA";
public static Object create(String str) {////////////返射机制的方法
Object cf=null;
try {
cf = (Object)Class.forName(str).newInstance();
}
catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
catch (IllegalAccessException ex) {
ex.printStackTrace();
}
catch (InstantiationException ex) {
ex.printStackTrace();
}
return cf;
}
调用:
classA cc=(classA)Assistant.create(Assistant.CLASSA);
cc.setRkey(rkey);
cc.getRkey();
classA cc=(classA)Assistant.create(Assistant.CLASSA);
cc.setRkey(rkey);
cc.getRkey();谢谢!
public static final String CLASSA= "classA";
public static final String CLASSB= "classB";
还是这么调用
classB cd=(classB)Assistant.create(Assistant.CLASSB);
cd.setRkey(rkey);
cd.getRkey();想做一个类就加一个属性就行了
cd.setRkey(rkey);
cd.getRkey();
public long getRkey();
public void setRkey(long rkey);
}public class ClassA implements GetRKey{
private long Rkey;
public long getRkey() {
return Rkey;
}
public void setRkey(long rkey) {
this.Rkey = rkey;
}
}public class ClassB implements GetRKey{
private long Rkey;
public long getRkey() {
return Rkey;
}
public void setRkey(long rkey) {
this.Rkey = rkey;
}
}public class Main{
public static void main(String[] args){
//实现ClassA的功能
GetRKey myKey = (GetRKey)Class.forName("ClassA").newInstance();
myKey.setRkey(123);
myKey.getRkey();
//实现ClassB的功能
GetRKey myKey = (GetRKey)Class.forName("ClassB").newInstance();
myKey.setRkey(321);
myKey.getRkey();
}
}
不知合不合要求
例子演示了这一实现。
-|Base.java //抽象基类
|Son1.java //基类扩展1
|Son2.java //基类扩展2
|Util.java
/**
* @author metaphy
* create 2005-4-14 9:06:56
* 说明:
*/
(1)Base.java 抽象基类只是一个定义
public abstract class Base {
}
(2)Son1.java /Son2.java 是已经实现的JavaBean
public class Son1 extends Base{
private int id ;
private String name ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void son1Method(String s){
System.out.println(s) ;
}
}
(3)
public class Son2 extends Base{
private int id;
private double salary;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
(4)Util.java 演示了如何根据指定的类名,类字段名和所对应的数据,得到一个类的实例
import java.lang.reflect.Method;
public class Util {
//此方法的最大好处是没有类名Son1,Son2 可以通过参数来指定,程序里面根本不用出现
public static Base convertStr2ServiceBean(String beanName,String fieldSetter,String paraValue){
Base base = null ;
try {
Class cls = Class.forName(beanName) ;
base = (Base)cls.newInstance() ;
Class[] paraTypes = new Class[]{String.class };
Method method = cls.getMethod(fieldSetter, paraTypes) ;
String[] paraValues = new String[]{paraValue} ;
method.invoke(base, paraValues) ;
} catch (Throwable e) {
System.err.println(e);
}
return base ;
}
public static void main(String[] args){
Son1 son1 =(Son1) Util.convertStr2ServiceBean("trying.reflect.Son1","setName","wang da sha");
System.out.println("son1.getName() :"+son1.getName()) ;
}
}
//调用结果:
//son1.getName() :wang da sha 谢谢!希望能给大家一点启发!
你这里已经基本上满足我的要求了。
在查找方法的时候,也要Method method = cls.getMethod(fieldSetter, null) ;
我的问题是如果setter里的变量是内置基本类型,例如int,double怎么办。我试了用wrapper类,如Integer,Double,好像不行,因为传过去的仍然是Object类,不是基本类型,会抛出java.lang.NoSuchMethedException异常。请各位DX指教。
method.invoke(instance, paraValues);
结果如下:
java.lang.NoSuchMethodException: ClassA.setKey(java.lang.Long)