概述
1. 返回来自命令行输入的某目标类的构造方法和各成员方法:
import java.lang.reflect.*;
class ClassTest
{
publicstaticvoid main(String[] args)
{
if(args.length!=1)
{
return;
}
try
{
Class c=Class.forName(args[0]); //从命令行得到一个类
Constructor[] cons=c.getDeclaredConstructors();
//得到该类的所有构造方法,无论是带参数的还是不带参数的
for(int i=0;i<cons.length;i++)
{
System.out.println(cons[i]);
}
//得到该类的所有成员方法
Method[] ms=c.getDeclaredMethods();
for(int i=0;i<ms.length;i++)
{
System.out.println(ms[i]);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point
{
static
{
System.out.println("Loading Point");
}
intx,y;
void output()
{
System.out.println("x="+x+","+"y="+y);
}
Point(int x,int y)
{
this.x=x;
this.y=y;
}
}
class Line
{
static
{
System.out.println("Loading Line");
}
}
2. 通过反射,获取了构造方法,并获取构造方法的参数类型,创建了参数的对象数组,给参数赋值,通过使用带参数的构造方法创建了一个类的对象(Object o=cons[0].newInstance(paramValues);),并调用了对象的成员方法。
import java.lang.reflect.*;
class ClassTest
{
publicstaticvoid main(String[] args)
{
if(args.length!=1)
{
return;
}
try
{
Class c=Class.forName(args[0]); //类的名字,来自命令提示行
Constructor[] cons=c.getDeclaredConstructors();//类的构造方法数组
Class[] params=cons[0].getParameterTypes();
//当前类中,只有一个构造方法。cons[0]表示的是第一个构造方法。
//使用cons[0].getParameterTypes();得到参数的类型
for(int i=0;i<params.length;i++){
System.out.println("params[]:" + params[i]);
}
//输出结果为:params:int
//params:int
Object[] paramValues=new Object[params.length];
//使用一个对象数组来存放参数的值,对象数组的大小和参数类型数组的大小相等
for(int i=0;i<params.length;i++)
{
if(params[i].isPrimitive())//参数是否是基本数据类型
{
paramValues[i]=new Integer(i+3);//给参数赋值
}
}
for(int i=0;i<paramValues.length;i++){
System.out.println("paramValues[]:" + paramValues[i]);
}
//输出结果为:paramValues:3
//paramValues:4
Object o=cons[0].newInstance(paramValues);
//传递参数到有参数构造方法Point(int x,int y)
//并用paramValues给构造方法赋值,paramValues是一个数组,所以多个参数可以支持。
Method[] ms=c.getDeclaredMethods();//类当中的成员方法数组
ms[0].invoke(o,null);
//调用类中第一个成员方法,其实就是output();
//o是目标类的对象,null是被调用的方法的参数。当前例子中output()没有参数,所以这里用null
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class Point
{
static
{
System.out.println("Loading Point");
}
intx,y;
void output()
{
System.out.println("x="+x+","+"y="+y);
}
Point(int x,int y)
{
this.x=x;
this.y=y;
}
}
class Line
{
static
{
System.out.println("Loading Line");
}
}
使用反射的场合:调试器,类的浏览器,图形界
最后
以上就是勤奋冷风为你收集整理的Java反射机制:核心是动态!的全部内容,希望文章能够帮你解决Java反射机制:核心是动态!所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复