A. java 反射机制的几个调用方法
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
/**
* Created by IntelliJ IDEA.
* File: TestRef.java
* User: leimin
* Date: 2008-1-28 14:48:44
*/
public class TestRef {
public staticvoid main(String args[]) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Foo foo = new Foo("这个一个Foo对象!");
Class clazz = foo.getClass();
Method m1 = clazz.getDeclaredMethod("outInfo");
Method m2 = clazz.getDeclaredMethod("setMsg", String.class);
Method m3 = clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo, "重新设置msg信息!");
String msg = (String) m3.invoke(foo);
System.out.println(msg);
}
}
class Foo {
private String msg;
public Foo(String msg) {
this.msg = msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void outInfo() {
System.out.println("这是测试反射的测试类");
}
}
B. java 反射 方法调用
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于专任意一个对属象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
说白了就是调用这个累的.Class方法然后调用其属性和方法。
C. 如何通过java 反射 调用一个 含有 可变参数的 方法呢
java反射调用可变参数的方法的方式是传入objects参数,如下代码:
publicclassReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Single.class;
Singlesingle=(Single)clazz.newInstance();
List<String>list=newArrayList<String>(){
=1L;
{
add("fuck");
add("ni");
add("mei");
}
};
//获取method两种方式,在method中数组的的空间大小是可以随便写的不一定使用0
/*1*/
Methodmethod=clazz.getDeclaredMethod("method",Array.newInstance(Object.class,0).getClass());
/*2*/
method=clazz.getDeclaredMethod("method",(newObject[0]).getClass());//初始化参数
/*1*/
Objectobjs=Array.newInstance(Object.class,2);
Array.set(objs,0,list);
Array.set(objs,1,"23");
method.invoke(single,objs);
/*2*/
Object[]objects={1,"fuck",list};
method.invoke(single,newObject[]{objects});
}
}
classSingle{
publicvoidmethod(Object...objs){
System.out.println(Arrays.deepToString(objs));
}
}
结果:
[[fuck,ni,mei],23]
[1,fuck,[fuck,ni,mei]]
D. Java如何接收使用反射执行方法所返回的值
importjava.lang.reflect.Constructor;
importjava.lang.reflect.Method;
publicclassReflectDemo{
publicstaticvoidmain(String[]args)throwsException{
//获取字节码文件对象
Classc=Class.forName("cn.itcast_01.Person");
//获取所有的方法
//Method[]methods=c.getMethods();//获取自己的包括父亲的公共方法
//Method[]methods=c.getDeclaredMethods();//获取自己的所有的方法
//for(Methodmethod:methods){
//System.out.println(method);
//}
Constructorcon=c.getConstructor();
Objectobj=con.newInstance();
/*
*Personp=newPerson();p.show();
*/
//获取单个方法并使用
//publicvoidshow()
//publicMethodgetMethod(Stringname,Class<?>...parameterTypes)
//第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型
Methodm1=c.getMethod("show");
//obj.m1();//错误
//publicObjectinvoke(Objectobj,Object...args)
//返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数
m1.invoke(obj);//调用obj对象的m1方法
System.out.println("----------");
//publicvoidmethod(Strings)
Methodm2=c.getMethod("method",String.class);
m2.invoke(obj,"hello");
System.out.println("----------");
//publicStringgetString(Strings,inti)
Methodm3=c.getMethod("getString",String.class,int.class);
ObjectobjString=m3.invoke(obj,"hello",100);
System.out.println(objString);
//Strings=(String)m3.invoke(obj,"hello",100);
//System.out.println(s);
System.out.println("----------");
//privatevoidfunction()
Methodm4=c.getDeclaredMethod("function");
m4.setAccessible(true);
m4.invoke(obj);
}
}
E. java 反射 调用无参数方法
通过Java反射调用无参数方法,这是个测试用的例子,通过反射调用对象的方法,代码如下:
importjava.lang.reflect.Method;
importjava.lang.reflect.InvocationTargetException;
/**
*CreatedbyIntelliJIDEA.
*File:TestRef.java
*User:Administrator
*Date:2015-7-1016:28:44
*/
publicclassTestRef{
publicstaticvoidmain(Stringargs[])throwsNoSuchMethodException,IllegalAccessException,InvocationTargetException{
Foofoo=newFoo("这个一个Foo对象!");
Classclazz=foo.getClass();
Methodm1=clazz.getDeclaredMethod("outInfo");
Methodm2=clazz.getDeclaredMethod("setMsg",String.class);
Methodm3=clazz.getDeclaredMethod("getMsg");
m1.invoke(foo);
m2.invoke(foo,"重新设置msg信息!");
Stringmsg=(String)m3.invoke(foo);
System.out.println(msg);
}
}
classFoo{
privateStringmsg;
publicFoo(Stringmsg){
this.msg=msg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
publicStringgetMsg(){
returnmsg;
}
publicvoidoutInfo(){
System.out.println("这是测试Java反射调用无参数方法的测试类");
}
}
控制台输出结果:
这是测试Java反射调用无参数方法的测试类
重新设置msg信息!
Processfinishedwithexitcode0
F. java反射中method类中的invoke方法是做什么的
就是调用类中的复方法,最制简单的用法是可以把方法参数化
invoke(class, method)
比如你Test类里有一系列名字相似的方法setValue1、setValue2等等
可以把方法名存进数组v[],然后循环里invoke(test,v[i]),就顺序调用了全部setValue