什么是反射?
反射是框架的灵魂,.java-.Class 是编译,而反射是从.Class-.java 的过程 就是去获取一个类里面的对象对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
反射时,可以获取类里面的,类的对象,Field(属性),Method类(方法),构造方法等......
在这里可以举个例子:获取Field(属性),Method类(方法)相对来说这两个重要
这个是我们要用到的类,叫Person
package com.Zking.xml;
public class Person {
private int pid;
private String pname;
private int page;
public Person() {
super();
// TODO Auto-generated constructor stub
}
//四大方法
//有参有返回
public String m4(Integer pid,String pname,Integer page) {
return pid +pname+page;
}
//有参无返回
public void m3(Integer pid,String pname,Integer page) {
System.out.println(pid);
System.out.println(pname);
System.out.println(page);
}
//无参无返回
public void m1() {
System.out.println("兰州拉面");
}
//无参有返回
public String m2() {
return "金桔柠檬";
}
public Person(int pid, String pname, int page) {
super();
this.pid = pid;
this.pname = pname;
this.page = page;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
}
接下来就是获取属性的方法:
//得到类的对象
Class c=Class.forName("com.Zking.xml.Person");
//属性
//Field f=c.getField("pname");
//得到属性名
//System.out.println(f.getName());
//得到修饰符
// System.out.println(f.getModifiers());
//得到数据类型
//System.out.println(f.getType());
// 得到一个person的对象 实例化的一个对象
//Object person=c.newInstance();
//赋值
//f.set(person, "李易峰");
//得到值
//System.out.println(f.get(person));
//得到类的属性
// Field f=c.getDeclaredField("page");
//f.setAccessible(true);
//Object person=c.newInstance();
//赋值
// f.set(person, 20);
//输出值
//System.out.println(f.get(person));
//得到当前类里面所以类的属性
Field[] fields=c.getDeclaredFields();
Object person=null;
for (Field f : fields) {
f.setAccessible(true);
person=c.newInstance();
if("pid".contains(f.getName())) {
f.set(person, 01);
}else if("pname".contains(f.getName())) {
f.set(person, "西柚");
}else if("page".contains(f.getName())) {
f.set(person, 10);
}
System.out.println(f.get(person));
}
这个是方法:
//方法
//无参无返回
Class v=Class.forName("com.Zking.xml.Person");
Object obj=v.newInstance();
Method m1=v.getMethod("m1", null);
m1.invoke(obj, null);
//无参有返回
Method m2=v.getMethod("m2", null);
System.out.println(m2.invoke(obj, null));
//有参无返回
Method m3=v.getMethod("m3", Integer.class,String.class,Integer.class);
m3.invoke(obj, 10,"榴莲",20);
//有参有返回
//Method m4=v.getMethod("m4", Integer.class,String.class,Integer.class);
//System.out.println(m4.invoke(obj, 20,"红柚",29));
//得到属性值
Method m4=v.getDeclaredMethod("m4",Integer.class,String.class,Integer.class );
m4.setAccessible(true);
System.out.println(m4.invoke(obj, 20,"红柚",20));
Class[] classes=m4.getParameterTypes();
for (Class cp : classes) {
System.out.println(cp.getSimpleName());
}
}
方法关键字 | 含义 |
getDeclaredMethods() | 获取所有的方法 |
getReturnType() | 获得方法的放回类型 |
getParameterTypes() | 获得方法的传入参数类型 |
getDeclaredMethod("方法名",参数类型.class,……) | 获得特定的方法 |
结果如下:
可以看person里面的赋值,这是简单的这个方法
以下就是小白的一些小见解,有不足的地方请多多指教!