各位大侠,帮帮我,看一下怎么解决这个问题???

2024-12-02 15:05:45
推荐回答(3个)
回答1:

不懂的问题,先自己想想,多查看API
下面给你解释下这个程序,主要用到了反射机制:

package com.test;
import java.lang.reflect.*;

public class ClassTest {
public static void main(String[] args) {
if (args.length != 1) {
return;
} else {
try {
//args不为空,传进来一个参数,比如com.test.Point (注意要加上包名)
Class c = Class.forName(args[0]);
//获取c所有的构造函数,这里就是获取到Point的构造函数。
Constructor[] cons = c.getDeclaredConstructors();
//获取c所有的方法
Method[] me = c.getDeclaredMethods();
//获取c所有的属性
Field[] fi = c.getDeclaredFields();
//获取第一个构造函数的参数类型,这里cl[0]为int,cl[1]也为int;
Class[] cl = cons[0].getParameterTypes();
//定义一个Object数组
Object[] obj = new Object[cl.length];
{
//下面是为构造函数创建参数
for (int i = 0; i < cl.length; i++) {
//isPrimitive() 判断是否为基本类型。是则用包装类,不用担心,待会构造的时候虚拟机会自动拆包。
if (cl[i].isPrimitive()) {
obj[i] = new Integer(i + 1);
}
}

}
//创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。o指向的是一个Point了
Object o = cons[0].newInstance(obj);
//对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。这里output没有参数,用null
me[0].invoke(o, null);
} catch (Exception e) {
e.printStackTrace();
}
}

}
}

class Point {
int x;
int y;
/*
* static { System.out.println("Loading Point"); }
*/
void outPut() {
System.out.println("x=" + x + "," + "y=" + y);
}

Point(int x, int y) {
this.x = x;
this.y = y;

}
}

回答2:

我不知道什么叫反射机制,但是楼主给的这段代码在NetBeans5.0中运行没有问题,成功输出了“x=1,y=2
”。楼主的问题可能是如何在运行主类时向Main函数传入参数。
如果在NetBeans里运行,在“项目属性”的“运行”设置里可以加参数,只要填上代码中Point类的全限定名称(包名.类名),例如对于mhl29的回答,填入com.test.Point。
如果用cmd命令行运行,则命令为java ClassTest -com.test.Point
如果运行时没有输入参数,则会出现错误non-varargs call of varargs method...原因是当没有参数时会有默认值java.lang.Object,该类第一个方法equals(java.lang.Object)是需要参数的,因此这样无参数的调用me[0].invoke(o, null)当然会有问题。

回答3:

解决什么问题?茂是很迷茫