1、什么是java反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。java的翻着原理其实就是将类中的各个成分(成员变量、方法、属性等)
2、反射的基本原理
下图是JVM加载类的基本原理,利用了反射机制
反射可以
(1)将.class文件反编译成为.java文件
(2)通过反射机制访问对象的属性、方法、构造方法
(3)开发各种通用框架(最重要的使用),比如Spring,里面很多的参数是配置化的,为了保证通用性,需要通过配置文件加载不同的类、对象或者调用不同的方法。
3、反射的基本使用
1、获取Class,主要有三种不同的方法:
(1)利用Object的getClass()方法,但是需要先产生类的对象才可以
import java.util.Date;
Date date = new Date();
Class<?> cls = date.getClass();
(2)利用“类.class”的形式取得Class类的对象。
import java.util.Date;
Class<?> cls = Date.class;
(3)利用Class类提供的forName()方法完成
Class<?> cls = Class.forName("java.util.Date");
创建对象,通过反射生成对象的两种方式
(1)使用Class对象的newInstance()方法来创建Class对象对应类的实例。
import java.util.Date;
Class<?> cls = Date.class;
Date date = (Date)cls.newInstance(); //实例化Date类的对象,调用.newInstance()方法之后返回的是Object对象,所以需要强制转型
(2)先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建对象,这种方法可以用指定的构造器构造类的实例。
//获取String的Class对象
Class<?> str = String.class;
//通过Class对象获取指定的Constructor构造器对象
Constructor constructor=str.getConstructor(String.class);
//根据构造器创建实例:
String s = (String)constructor.newInstance(“hello reflection”);
(3)获取方法并调用:使用**Class类的getMethod()**方法获取方法,然后进行方法的反射调用
import java.long.reflect.Method;
class Book{
private String title;
public void setTitle(String title){
this.title = title;
}
public String getTitle(){
return title;
}
}
public class TestReflect{
public static void main(String args[]) throws Exception{
String filedName = "title"; //要操作的属性
String titleValue = "Spring 实战";
Class<?> cls = Class.forName("Book");
Object obg = cls.newInstance();
Method setMethod = cls.getMethod("set"+initcap(fileName),String.class);
Method getMethod = cls.getMethod("get"+initcap(fileName));
setMethod.invoke(obj,titleValue); //对象.setTile()调用
System.out.println(getMethod.invoke(obj)); //对象.getTitle()调用
}
public static String initcap(String s){
return s.substring(0,1).toUpperCase()+s.substring(1);
}
}