package testInvoke;public class Form1{ public Form1(){
} private String a = null; public final String getA() { return a; } public final void setA(String a) { this.a = a; } }package testInvoke;public class Form2{ private Form1[] form = null; public final Form1[] getForm() { return form; } public final void setForm(Form1 form[]) { this.form = form; }
public Form2(){
}}程序比较复杂,简单摘了些出来。代码比较简单,就没有加注释。
稍微修改了一下,那调用反射方法的时候类型不匹配package test;import java.io.IOException; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.sql.SQLException; import java.util.ArrayList;public class TestInvoke { public static void main(String[] argv) throws IOException, SQLException { Form2 form = new Form2();
Class mainFormClass = Class.forName(formName);看到这两句实在让人哭笑不得! getClass()你已经用到了,不知道为什么要..... 而且你用Class.forName还要处理异常!和这个差不多 int i=10; int j=Integer.parseInt(String.valueOf(i)); 是不是觉得代码多的爽呀,或者觉得让CPU闲着不爽呀
xxxArray[0] = (xxx)Class.forName("xxx").newInstance();
.............
java.lang.reflect.Array.newInstance(Class type,int length);
java.lang.reflect.Array.newInstance(Class type,int[] dimensions);
现在是这样的,因为我要用的是invoke()方法,所以必须是精确类型的。
Array.newInstance或者ArrayList.toArray都能得到,但是类型都是Object[]或者Object类型。不知道能不能得到精确类型。是不是实现不了啊?我对java属于刚刚入门,请各位高手指点。
for{
Object objdata = Class.forName("xxx").newInstance();
aryData.add(j,objdata);
}Object[] obj = {};
obj = (Object[])aryData.toArray(obj);Object[] vals = {obj};
meth.invoke(form, vals);invoke行:
[05/10/31 10:44:56:505 CST] eae762b SystemOut O Exception:argument type mismatch如果写成这样:
for{
Object objdata = Class.forName("xxx").newInstance();
aryData.add(j,objdata);
}xxx[] obj = {};
obj = (xxx[])aryData.toArray(obj);Object[] vals = {obj};
meth.invoke(form, vals);运行通过,可是现在由于xxx是运行的时候才知道的类型,现在不能这么写。不知道怎么写才能实现。
private xxx[] xxxlist = null;
public void setxxxList(xxx[] list){
xxxlist = list;
}
上面代码中的meth.invoke(form, vals);就是set方法。
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.ArrayList;public class testInvoke { public static void main (String[] argv) throws IOException, SQLException {
Form2 form = new Form2();
try{
invoke(form);
}catch (Exception e){
e.printStackTrace();
}
} public static void invoke(Form2 form)throws Exception{
String formName =("" + form.getClass()).substring(("class ").length());
Class mainFormClass = Class.forName(formName);
Method[] mainFormMethod = mainFormClass.getMethods();
Method meth = null;
String strCName = null;
for(int i = 0 ; i<mainFormMethod.length; i++ ){
System.out.println("mainFormMethod[i].getName[" + i + "]:" + mainFormMethod[i].getName());
if(mainFormMethod[i].getName().equals("setForm")){
String name = "" + mainFormMethod[i];
System.out.println("name:" + name);
meth = mainFormMethod[i];
strCName = name.substring(name.indexOf("(") + 1,name.indexOf("[]"));
System.out.println("strCName:" + strCName);
break;
}
}
ArrayList ary = new ArrayList();
for(int i = 0 ; i < 2 ; i ++){
Class subFormClass = Class.forName(strCName);
Object subForm = Class.forName(strCName).newInstance();
Class[] type = {String.class};
Method subFormMethod = subFormClass.getMethod("setA",type);
Object[] val = {"vvv"};
subFormMethod.invoke(subForm,val);
ary.add(i,subForm);
}
Object[] obj = {};
obj = (Object[])ary.toArray(obj);
System.out.println("obj");
Object[] a = {obj};
meth.invoke(form,a);
System.out.println("meth.invoke(form,obj);--------");
}
}
package testInvoke;public class Form1{
public Form1(){
}
private String a = null; public final String getA() {
return a;
} public final void setA(String a) {
this.a = a;
}
}package testInvoke;public class Form2{
private Form1[] form = null; public final Form1[] getForm() {
return form;
} public final void setForm(Form1 form[]) {
this.form = form;
}
public Form2(){
}}程序比较复杂,简单摘了些出来。代码比较简单,就没有加注释。
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.ArrayList;public class TestInvoke { public static void main(String[] argv) throws IOException, SQLException {
Form2 form = new Form2();
try {
invoke(form);
} catch (Exception e) {
e.printStackTrace();
}
} public static void invoke(Form2 form) throws Exception {
//String formName = ("" + form.getClass()).substring(("class ").length()); //Class mainFormClass = Class.forName(formName);
Class mainFormClass=form.getClass(); //北京到天津 还要绕过上海?
Method[] mainFormMethod = mainFormClass.getMethods();
Method meth = null;
String strCName = null;
for (int i = 0; i < mainFormMethod.length; i++) {
System.out.println("mainFormMethod[i].getName[" + i + "]:"
+ mainFormMethod[i].getName());
if (mainFormMethod[i].getName().equals("setForm")) {
String name = "" + mainFormMethod[i];
//System.out.println("name:" + name);
meth = mainFormMethod[i];
//strCName = name.substring(name.indexOf("(") + 1, name
// .indexOf("[]"));
//System.out.println("strCName:" + strCName);
break;
}
}
ArrayList ary = new ArrayList();
Class subFormClass=meth.getParameterTypes()[0].getComponentType();
System.out.println(meth.getName());
for (int i = 0; i < 2; i++) {
//Class subFormClass = Class.forName(strCName);
//Object subForm = Class.forName(strCName).newInstance();
Object subForm = subFormClass.newInstance();
Class[] type = { String.class };
Method subFormMethod = subFormClass.getMethod("setA", type); Object[] val = { "vvv" };
subFormMethod.invoke(subForm, val); ary.add(i, subForm);
} Object[] obj = (Object[]) Array.newInstance(subFormClass, ary.size());//{};
obj = (Object[]) ary.toArray(obj); System.out.println("obj");
Object[] a = { obj };
meth.invoke(form, a);
System.out.println("meth.invoke(form,obj);--------");
}
}class Form1 { public Form1() { } private String a = null; public final String getA() {
return a;
} public final void setA(String a) {
this.a = a;
}
}class Form2 {
private Form1[] form = null; public final Form1[] getForm() {
return form;
} public final void setForm(Form1 form[]) {
this.form = form;
} public Form2() { }}
Class mainFormClass = Class.forName(formName);看到这两句实在让人哭笑不得!
getClass()你已经用到了,不知道为什么要.....
而且你用Class.forName还要处理异常!和这个差不多
int i=10;
int j=Integer.parseInt(String.valueOf(i));
是不是觉得代码多的爽呀,或者觉得让CPU闲着不爽呀
程序通过了,问题应该可以解决了。可是两行代码还请大侠给解释一下:
Object[] obj = {};
obj = (Object[]) ary.toArray(obj);Object[] obj = (Object[]) Array.newInstance(subFormClass, ary.size());//{};
obj = (Object[]) ary.toArray(obj);
在有明确的对象类型时,我以前都是按照上面的用的,所以这次也就习惯性的写上了。我不知道两个有什么区别。ary.toArray怎么执行?
List.toArray(Object[] objs)//得到的类型和传入的参数类型一样Object[] obj={} 是一个空的Object数组,和 Object[] obj=new Object[0]一样
如果你事先知道类型是Form2
Object[] obj=new Form2[0] 是可以的
如果不知道的,只有通过反射了,当然数组大小不会影响类型
Object[] obj = (Object[]) Array.newInstance(subFormClass, 0); //改为0也是可以的
obj = (Object[]) ary.toArray(obj);
我一直以为得到类型和(Object[]) 一致呢,原来是和传入的obj一致啊。
多谢了。看来以后还要多看看书才行啊。
学习java从今天开始