什么是反射?
Java语言的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法
类类
类类:描述类的类,不是官方定义的语言
- Class.forName(完整的类名)
- 类名.class
- 对象.getClass()
其中,Class.forName(完整的类名)是三者当中灵活性最强的,作者使用较多
//获取类对象
//Class.forName(完整的类名)
Class<Student> class01 = (Class<Student>)Class.forName("com.zking.fs.Student");
//类名.class
Class class02 =Student.class;
//对象.getClass()
Student stu = new Student();
Class class03 = stu.getClass();
System.out.println(class01);
System.out.println(class02);
System.out.println(class03);
反射实例化
获取构造函数的方法
getConstructor
getDeclareadConstr(用于获取私有的构造函数)
newInstance
//通过class01实例化对象
Constructor<Student> constructor1 = class01.getConstructor();
//通过新建一个实例
Student stu1 = constructor1.newInstance();
stu1.setSid("4");
stu1.setSname("fd");
System.out.println(stu1);
Constructor<Student> constructor5 = class01.getDeclaredConstructor(String.class,String.class);
Student stu6 = constructor5.newInstance("we","fd");
System.out.println(stu6);
反射动态方法调用
- getMethod
- getDeclareadMethod
- 公有构造函数
//获取方法对象
Method method = class01.getMethod("hello");
stu6.setSname("fd");
//方法对象调用对象
method.invoke(stu6);
Method method3 = class01.getDeclaredMethod("add",Integer.class,Integer.class);
//因为是私有的构造函数,所以要开放权限
method3.setAccessible(true);//可操作的
System.out.println(method3.invoke(stu6, 23,54));
反射读写属性
getField
getDeclaredField
Field field = class01.getField("age");
field.set(stu6, 76);
System.out.println(stu6);
Field field2 = class01.getDeclaredField("sname");
field2.setAccessible(true);
field2.set(stu6, "sdf");
System.out.println(stu6);
源代码
文件:Demo.java
package com.zking.fs;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Class<Student> class01 = (Class<Student>)Class.forName("com.zking.fs.Student");
// Class class02 =Student.class;
// Student stu = new Student();
// Class class03 = stu.getClass();
// System.out.println(class01);
// System.out.println(class02);
// System.out.println(class03);
Constructor<Student> constructor1 = class01.getConstructor();
Student stu1 = constructor1.newInstance();
stu1.setSid("4");
stu1.setSname("fd");
System.out.println(stu1);
Constructor<Student> constructor2 = class01.getConstructor(String.class,String.class);
Student stu2 = constructor2.newInstance("12","er");
System.out.println(stu2);
Constructor<Student> constructor3 = class01.getConstructor(String.class,String.class,Integer.class);
Student stu3 = constructor3.newInstance("12","er",34);
System.out.println(stu3);
Constructor<Student> constructor4 = class01.getConstructor(String.class);
Student stu4 = constructor4.newInstance("er");
System.out.println(stu4);
Constructor<Student> constructor5 = class01.getDeclaredConstructor(String.class,String.class);
Student stu6 = constructor5.newInstance("we","fd");
System.out.println(stu6);
Method method = class01.getMethod("hello");
stu6.setSname("fd");
method.invoke(stu6);
Method method2 = class01.getMethod("hello", String.class);
method2.invoke(stu6,"dsfd");
Method method02 = class01.getMethod("hello",String.class);
Object invoke = method02.invoke(stu6, "zengfanyan");
System.out.println(invoke);
Method method3 = class01.getDeclaredMethod("add",Integer.class,Integer.class);
method3.setAccessible(true);
System.out.println(method3.invoke(stu6, 23,54));
Field field = class01.getField("age");
field.set(stu6, 76);
System.out.println(stu6);
Field field2 = class01.getDeclaredField("sname");
field2.setAccessible(true);
field2.set(stu6, "sdf");
System.out.println(stu6);
}
}
文件:Student.java
package com.zking.fs;
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("调用带二个参数的构造方法创建了一个学生对象");
}
public Student(String sid, String sname, Integer age) {
super();
this.sid = sid;
this.sname = sname;
this.age = age;
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("1你好!我是" + this.sname);
}
public void hello(String name) {
System.out.println(name + "2你好!我是" + this.sname);
}
@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intValue() + b.intValue());
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + "]";
}
}