java的反射机制
一 反射机制的概念:
-
指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制.
-
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为"动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
二 反射机制的应用:
生成动态代理,面向切片编程(在调用方法的前后各加栈帧).
public class _14_ReflectTest07{
public static void main(String[] args) throws Exception{
//1.获取类
Class c = Class.forName("_12_CustomerService");
//获取某个特定的方法
//通过:方法名+形参列表
Method m = c.getDeclaredMethod("login",String.class,String.class);
//通过反射机制执行login方法.
Object o = c.newInstance();
//调用o对象的m方法,传递"admin""123"参数,方法的执行结果是retValue
Object retValue = m.invoke(o, "admin","123");
System.out.println(retValue); //true
}
}
public class _12_CustomerService{
//登录
public boolean login(String name,String pwd){
if("admin".equals(name) && "123".equals(pwd)){
return true;
}
return false;
}
//退出
public void logout(){
System.out.println("系统已安全退出!");
}
}
import java.lang.reflect.*;
class LatentReflection{
public static void main(String[] args){
Reflect.perform(new Dog());
Reflect.perform(new Cat());
Reflect.perform(new Fish());
}
}
//反射
class Dog{
public void speak(){
System.out.println("汪汪汪!!!");
}
public void eat(){
System.out.println("吃东西");
}
}
class Cat{
public void speak(){
System.out.println("喵~喵~喵~");
}
public void eat(){
System.out.println("吃东西");
}
}
class Fish{
public void eat(){
System.out.println("吃东西");
}
public void swim(){
System.out.println("游泳");
}
}
class Reflect{
public static void perform(Object speaker){
Class<?> spkr = speaker.getClass();
try{
try{
Method speak = spkr.getMethod("speak");
speak.invoke(speaker);
}catch(NoSuchMethodException e){
System.out.println(speaker + "cannot speak");
}
try{
Method eat =spkr.getMethod("eat");
eat.invoke(speaker);
}catch(NoSuchMethodException e){
System.out.println(speaker + "cannot eat");
}
}catch(Exception e){
throw new RuntimeException(speaker.toString(),e);
}
}
}
汪汪汪!!!
吃东西
喵~喵~喵~
吃东西
Fish@7852e922cannot speak
吃东西
反射机制是框架技术的原理和核心部分。通过反射机制我们可以动态的通过改变配置文件(以后是XML文件)的方式来加载类、调用类方法,以及使用类属性。这样的话,对于编码和维护带来相当大的便利。在程序进行改动的时候,也只会改动相应的功能就行了,调用的方法是不用改的。更不会一改就改全身。