JAVA反射机制是构建框架技术的基础所在。
灵活掌握Java反射机制,能让代码变得更灵活
为什么已经有new实例化了还要学反射呢?
因为反射实例化能实例化未知的对象帮助开发人员处理未知的网络请求
通过反射可以动态的
实例化对象
读写属性
调用方法
一切反射相关的代码都从获得类对象开始
那么怎么获得类对象呢?
获得类对象有三种方法
1、Class.forName(类的完整路径名)
2、类名.class
3、对象.getClass()
实例化对象分四种
1、无参公有的实例化
2、有一个参数的公有构造器实例化
3、有两个参数的公有构造器实例化
4、私有的构造器实例化 重点
用途:可以用在调用分页中的查询中
调用方法一般分三种
1、无参公有的方法调用
2、有一个参数的方法调用
3、私有的方法调用
用途:可以用在自定义mvc的增强子控制器中
读写属性分两种
1、公有的
2、私有的
用途:通用的增删改
这里用的是学生类做例,学生类代码如下:
package com.wangjuanxia;
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());
}
}
1、Class.forName("")
Class<?> clz = Class.forName("com.wangjuanxia.Student");
2、xxx.class
Class<?> clz =Student.class;
3、对象.getClass
实例化对象,再获取对象
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
共四种
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
Student stu = (Student) clz.newInstance();
System.out.println(stu);
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
Constructor<? extends Student> c = clz.getConstructor(String.class);
Student student = c.newInstance("s001");
System.out.println(student);
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
Constructor<? extends Student> c = clz.getConstructor(String.class,String.class);
Student student = c.newInstance("s001","zs");
System.out.println(student.getSid()+" "+student.getSname());
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
Constructor<? extends Student> c = clz.getDeclaredConstructor(Integer.class);
c.setAccessible(true);
Student student = c.newInstance(22);
System.out.println(student.age);
共三种
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
Method m = clz.getMethod("hello");
Object invoke = m.invoke(stu);
System.out.println(invoke);
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
Method m = clz.getMethod("hello", String.class);
Object invoke = m.invoke(stu, "zs");
System.out.println(invoke);
Student stu=new Student();
Class<? extends Student> clz = stu.getClass();
Method m = clz.getDeclaredMethod("add", Integer.class,Integer.class);
m.setAccessible(true);
Object invoke = m.invoke(stu, 12,3);
System.out.println(invoke);
共两种
Student stu=new Student();
stu.setSid("1");
stu.setSname("zs");
stu.age=18;
Class<? extends Student> clz = stu.getClass();
Field f3 = clz.getField("age");
f3.set(stu, 16);
System.out.println(f3.get(stu));
Student stu=new Student();
stu.setSid("1");
stu.setSname("zs");
stu.age=18;
Class<? extends Student> clz = stu.getClass();
Field f = clz.getDeclaredField("sname");
f.setAccessible(true);
f.set(stu, "ls");
System.out.println(f.get(stu));
Field f2 = clz.getDeclaredField("sid");
f2.setAccessible(true);
f2.set(stu, "2");
System.out.println(f2.get(stu));