反射:对于任意一个类型,可以获取其方法和属性的 ; 任意一个对象,可以访问其方法和属性的能力
代码:
public class Users {
private String uid;
private String uname;
private int age;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Users(String uid, String uname, int age) {
super();
this.uid = uid;
this.uname = uname;
this.age = age;
}
public Users() {
super();
}
}
public class Person {
private int pid;
private String pname;
private double pcore;
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 double getPcore() {
return pcore;
}
public void setPcore(double pcore) {
this.pcore = pcore;
}
public Person(int pid, String pname, double pcore) {
super();
this.pid = pid;
this.pname = pname;
this.pcore = pcore;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public int uuvvww(){
return 200+(int)(Math.random()*200);
}
protected void myTest0(){ }
public int myTest1(int x, int y){
System.out.println("...执行...myTest1");
return x+y;
}
public void myTest2(String x , int y){
System.out.println("...执行...myTest2");
}
class AA{}
}
public class A {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
Users u1 = new Users();
u1.setUid("1");
u1.setUname("张三");
u1.setAge(20);
System.out.println("0..."+u1);
System.out.println("1..."+u1.getUname());
System.out.println("------------");
//大致了解 反射
//根据字符串加载类型到运行环境中, 获取Person类型
Class cls = Class.forName("com.zk.entity.Person");//import com.zk.entity.Person;
//根据类型创建对象 ,无需import
Object obj = cls.newInstance(); //Person p1 = new Person();
System.out.println("0..."+obj);
Method setPname = cls.getMethod("setPname", String.class);//获取Person中的setPname方法
Method setPcore = cls.getMethod("setPcore", double.class);//获取Person中的setPcore方法
setPname.invoke(obj, "李四"); // p1.setPname("李四");
setPcore.invoke(obj, 100);// p1.setPcore(100);
Method getPname=cls.getMethod("getPname" );
Method getPcore=cls.getMethod("getPcore" );
System.out.println("1..."+getPname.invoke(obj)); //"1.." + p1.getPname()
System.out.println("1..."+getPcore.invoke(obj)); //"1.." + p1.getPcore()
}//main()
}
运行结果:
0...com.zk.entity.Users@6af62373
1...张三
------------
0...com.zk.entity.Person@55f33675
2...李四
2...100.0
public class B extends A implements Serializable{
public static void main(String[] args) throws ClassNotFoundException {
//大致了解 反射
//根据字符串加载类型到运行环境中, 获取Person类
Class cls = Class.forName("com.zk.entity.Person");
//该类型的属性
Field[] attrs = cls.getDeclaredFields();
System.out.println("1---类型属性:自己的 Declared");
for (Field f : attrs) {
System.out.println(f);
}
System.out.println("2---类型属性:自己和继承而来的");
Field[] attr2 = cls.getFields();
for (Field f : attr2) {
System.out.println(f);
}
System.out.println("3--类型构造器:自己的Declared");
Constructor[] tor = cls.getDeclaredConstructors();
for (Constructor ct : tor) {
System.out.println(ct);
}
System.out.println("3--类型构造器:全部的自己的");
Constructor[] tor2=cls.getConstructors();
for (Constructor ct: tor2) {
System.err.println(ct);
}
//该类型的接口
System.out.println("4..类型的接口");
Class[] ints = cls.getInterfaces();
for (Class c : ints) {
System.out.println(c);
}
//该类型的内部类
System.out.println("4..类型的内部类:Declared");
Class[] css = cls.getDeclaredClasses();
for (Class c : css) {
System.out.println(c);
}
}//main()
}
运行结果:
1---类型属性:所有的自己的 Declared
private int com.zk.entity.Person.pid
private java.lang.String com.zk.entity.Person.pname
private double com.zk.entity.Person.pcore
2---类型属性:自己和继承而来的public
3--类型构造器:自己的Declared
public com.zk.entity.Person()
public com.zk.entity.Person(int,java.lang.String,double)
3--类型构造器:全部的(自己的和父类的)
4..类型的接口public com.zk.entity.Person()
public com.zk.entity.Person(int,java.lang.String,double)
4..类型的内部类:Declared
class com.zk.entity.Person$AA
public class C {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
//大致了解 反射
//根据字符串加载类型到运行环境中, 获取Person类型
Class cls = Class.forName("com.zk.entity.Person");
//获取 方法名 参数
Method mt1 = cls.getDeclaredMethod("getPname");
Method mt2 = cls.getDeclaredMethod("myTest1",int.class,int.class);
Method mt3 = cls.getDeclaredMethod("myTest2",String.class,int.class);
//实例
Object nts =cls.newInstance();
//调用 并 接收返回值
Object ret1 = mt1.invoke(nts);//调用nts对象的getPname()
Object ret2 = mt2.invoke(nts, 10,50); //调用nts对象的myTest1(10,50)
Object ret3 = mt3.invoke(nts, "齐八",50);//调用nts对象的myTest2("齐八",50)
System.out.println("1.."+ret1); //字符串做为 成员变量 的默认值
System.out.println("2.."+ret2);
System.out.println("3.."+ret3); //void本身是没有返回值的
//--------------
Field f1 = cls.getDeclaredField("pname");
System.out.println("4.." +f1);
}//main()
}
运行结果:
...执行...myTest2
1..null
2..60
3..null
4..private java.lang.String com.zk.entity.Person.pname
部分异常:
ClassNotFoundException //类型没有找到
InstantiationException //初始化错误
NoSuchMethodException //没有匹配的方法
SecurityException //安全性错误
InvocationTargetException // 目标调用异常(反射异常)
IllegalArgumentException //非法数据异常