反射
实体类
package com.rong.reflect;
/**
*
* @author 小荣
*
* 下午12:29:56
*/
public class Student {
private String sid;
private String sname;
public Integer age;
static{
System.out.println("加载进jvm中!");
}
public Student() {
super();
System.out.println("调用无参构造方法创建了一个学生对象");
}
public Student(String sid) {
super();
this.sid = sid;
System.out.println("调用带一个参数的构造方法创建了一个学生对象");
}
public Student(String sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
System.out.println("调用带二个参数的构造方法创建了一个学生对象");
}
@SuppressWarnings("unused")
private Student(Integer age) {
System.out.println("调用Student类私有的构造方法创建一个学生对象");
this.age = age;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public void hello() {
System.out.println("你好!我是" + this.sname);
}
public void hello(String name) {
System.out.println(name + "你好!我是" + this.sname);
}
@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intValue() + b.intValue());
}
}
实例化对象
oop式
Student stu=new Student();
Class clz=stu.getClass();
System.out.println(clz);
反射式
java.lang.NoSuchMethodException:student类中没有Intger为参数的构造方法
getConstructor是获取到public修饰的构造方法
getDeclaredConstructor能够获取到任意修饰符的构造器
java.lang.IllegalAccessException:非访问,因为这个构造器是private修饰
无参构造实例化
类构造方法
反射实例化
Student stu2=(Student) clz.newInstance();
System.out.println(stu2);
输出结果
一个参数的共有构造实例化
类构造方法
反射实例化
Constructor<? extends Student> c=clz.getConstructor(String.class);
Student stu3=c.newInstance("s001");
System.out.println(stu3);
输出结果
俩个参数的共有构造实例化
类构造方法
反射实例化
Constructor<? extends Student> c2=clz.getConstructor(String.class,String.class);
Student stu4=c2.newInstance("s001","张三");
System.out.println(stu4);
输出结果
私有的构造器实例化
类构造方法
反射实例化
Constructor<? extends Student> c3=clz.getDeclaredConstructor(Integer.class);
c3.setAccessible(true);
Student stu5=c3.newInstance(22);
System.out.println(stu5);
输出结果
调用方法
动态调用的方法,如果该方法是void类型的返回值,那么被invoke,此时结果为null;
如果方法是非void类型的返回值,那么被invoke后,就是该被调用方法后的结果
无参共有的方法调用
类方法
public void hello() {
System.out.println("你好!我是" + this.sname);
}
反射调用
Student stu=new Student();
Class<? extends Student> clz=stu.getClass();
Method m=clz.getMethod("hello");
Object invoke=m.invoke(stu);
System.out.println(invoke);
结果
有一个参数的方法调用
类方法
public void hello(String name) {
System.out.println(name + "你好!我是" + this.sname);
}
反射调用
System.out.println("--------------------");
Method m2=clz.getMethod("hello", String.class);
Object invoke2=m2.invoke(stu, "zhangsan");
System.out.println(invoke);
结果
私有的方法调用
类方法
@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intValue() + b.intValue());
}
反射调用
System.out.println("--------------------");
Method m3=clz.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);
Object invoke3=m3.invoke(stu, 20,5);
System.out.println(invoke3);
结果
读写属性
先赋值
Student stu=new Student("s001", "zhangsan");
stu.age=22;
结果
读取单个属性
代码
Class<? extends Student> clz=stu.getClass();
Field f=clz.getDeclaredField("sname");
f.setAccessible(true);
System.out.println(f.get(stu));
结果
一次性获取该类所有属性值(常用)
代码
System.out.println("------------------------");
Field[] fs=clz.getDeclaredFields();
for(Field ff:fs) {
ff.setAccessible(true);
System.out.println(ff.get(stu));
}
结果
想通过反射改变sname对应的值
代码
System.out.println("------------------------");
f.set(stu, "lisi");
System.out.println(stu.getSname());
}
结果
总结
一个熬夜敲代码的小袁,我知道的都在这了,希望能帮到你,睡觉!