反射的概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。
Java reflect 反射 0 java对象的三个阶段
反射具体实现
package reflect;
import java.lang.reflect.Method;
public class Tests {
public static void main(String[] args) throws Exception{
//refeltEntity().show("welcome");;//entity.show("welcome");
refeltMethod();
}
/**
* 通过反射获取java类中get方法对应的值
* @throws Exception
* @Description:
*/
public static void getValueEnter() throws Exception{
//String from, String to, String position, int id
IpBean entity = new IpBean("北京","上海","9.11116",101);
Class clz = entity.getClass();
Method[] methods = clz.getDeclaredMethods();
String methodName = "";
String methodVal = "";
for(Method m:methods){
methodName = m.getName();
//System.out.println(methodName.indexOf("get"));
if(methodName.indexOf("get")==0){
Object obj = m.invoke(entity,null);
methodVal = obj==null?"":obj.toString();
System.out.println(methodName+":"+methodVal);
}
}
}
public static void refeltMethod() throws Exception{
String IpCls = "reflect.IpBean";
Class clz = Class.forName(IpCls);
//获取类的完整路径
System.out.println(clz.getName());
IpBean entity = (IpBean) clz.newInstance();
entity.setFrom("beijing");
entity.setTo("xianguang");
/**
* 第一个参数是函数的名称,第二个参数是...(表示有无限个参数)表示函数的参数
*/
Method method = clz.getMethod("show", String.class);
/**
* 第一个参数是调用函数的对象,第二个参数是函数执行时的参数
* entity.show("welcome");
*/
method.invoke(entity, "welcome");
/**
* 同样可以调用静态方法
*/
method = clz.getMethod("getMsg", String.class,String.class);
method.invoke(clz, "张斌",22+"");
}
public static IpBean refeltEntity() throws Exception{
String IpCls = "reflect.IpBean";
Class clz = Class.forName(IpCls);
//获取类的完整路径
System.out.println(clz.getName());
IpBean entity = (IpBean) clz.newInstance();
entity.setFrom("beijing");
entity.setTo("xianguang");
return entity;
}
}
## 新建一个实体类
package reflect;
@data
public class IpBean {
private String from; // IP段起始
private String to; // IP结束
private String position; // 地理名称
private int id = 0;
public void show(String msg) {
System.out.println(from + "---" + to + "-->" + msg);
}
public static void getMsg(String name, String age) {
System.out.println(name + "----->" + age);
}
}