一:百度百科介绍
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为
动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
二:反射对于JAVA的重要性
JAVA反射是使在运行状态中,对于任何的一个类都能知道这个类里面所以的方法,属性。对于任何一个对象都可以调用它的方法和属性。在JAVA架构中是不可缺少的一环。
三:反射在JAVA中的运用
代码如下:
建立实体类
package com.zking.reflection;
public class Peoples {
private String name;
private String sex;
private String id;
//无参无返回
private void a() {
System.out.println("a");
}
//有参无返回
private void b(String b) {
System.out.println(b);
}
//无参有返回
private String c() {
return "c";
}
//有参有返回
private String d(String d) {
return d;
}
}
建立reflect进行反射
代码如下:
package com.zking.reflection;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Reflection {
private static final Class String = null;
public static void main(String[] args) throws Exception {
// 获取地址
Class c = Peoples.class.forName("com.zking.reflection.Peoples");
// 设置访问类型
c.getDeclaredFields();
//获取父類
System.out.println(c.getSuperclass());
//獲取接口信息
System.out.println(c.getInterfaces());
// 获取ID属性
Field id = c.getDeclaredField("id");
System.out.println(id.getName());
// 获取name属性
Field name = c.getDeclaredField("name");
System.out.println(name.getName());
// 获取SEX属性
Field sex = c.getDeclaredField("sex");
System.out.println(sex.getName());
// 实例化对象
Object obj = c.newInstance();
// 获取名为a的方法
Method a = c.getDeclaredMethod("a", null);
//設置可訪問
a.setAccessible(true);
//調用a方法
System.out.println(a.invoke(obj, null));
// 获取名为b的方法
Method b = c.getDeclaredMethod("b", String.class);//设置数据类型需与实体类方法参数类型一致
//設置可訪問
b.setAccessible(true);
//調用b方法
System.out.println(b.invoke(obj, "b"));
// 获取名为c的方法
Method c1 = c.getDeclaredMethod("c", null);
//設置可訪問
c1.setAccessible(true);
//調用c方法
System.out.println(c1.invoke(obj, null));
// 获取名为d的方法
Method d = c.getDeclaredMethod("d", String.class);//设置数据类型需与实体类方法参数类型一致
//設置可訪問
d.setAccessible(true);
//調用d方法
System.out.println(d.invoke(obj, "d"));
}
}
最后附上一张反射常用的方法图