什么是反射?
反射是框架的灵魂,.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里面的赋值,这是简单的这个方法
以下就是小白的一些小见解,有不足的地方请多多指教!