
一、什么是反射
反射Java语言中的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法,我们可以调用属性的私有方法了。
二、类类
类类指的是,一个对象的实体类的类,通俗一点理解:类类是所有类的最大级
获得类类的三种方法:
①、Class.forName(完整类名)
②、类名:.class
③、对象:.getClass()
三、反射的具体实现
下面是一个基本的类 Person
package com.zking.reflect;
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());
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", age=" + age + "]";
}
}
获取反射的方法三个

代码如下
//获取Class的三种方法
Class<?> clzz01 = Class.forName("com.zking.reflect.Student");//Class.forName("全路径名")
Class<?> clzz02=Student.class;//类名.class
Student stu=new Student();
Class<?> clzz03 = stu.getClass();
System.out.println(clzz01);
System.out.println(clzz02);
System.out.println(clzz03);
三、反射实例化
三种方法:
1、getConstructor (获得构造器对象)
2、getDeclaredConstructor (获得构造器对象,私有化时)
3、newInstance (反射实例化)
getConstructor方法只能用于获取公开构造函数
newInstance获取一个实例
结果如下

/*调用无参构造*/
//方法:
//getConstructor方法只能用于获取公开构造函数
//newInstance获取一个实例
Constructor<?> c1 = clzz01.getConstructor();
Student stu01 =(Student)c1.newInstance();
System.out.println(stu01);
System.out.println("-------------------------------");
/*调用一个有参构造*/
Constructor<?> c2 = clzz01.getConstructor(String.class);
Student stu02 =(Student) c2.newInstance("1");
System.out.println(stu02);
System.out.println("-------------------------------");
/*调用一个多参数构造*/
Constructor<?> c3 = clzz01.getConstructor(String.class,String.class);
Student stu03 = (Student)c3.newInstance("2","zs");
System.out.println(stu03);
System.out.println("-------------------------------");
/*用getDeclaredConstructor方法调用私有有参构造*/
Constructor<?> ctt4 = clzz01.getDeclaredConstructor(Integer.class);
ctt4.setAccessible(true);//强制反射
Student stu04 = (Student)ctt4.newInstance(34);
System.out.println(stu04);
System.out.println("-------------------------------");
/*用getMethod获取hello在用stu3对象调用hello无参构造里的中方法*/
Method method1 = clzz01.getMethod("hello");
method1.invoke(stu03);
/*用getMethod获取hello在用stu3对象调用hello有参构造里的中方法*/
//通过反射hello方法
Method method02 = clzz01.getMethod("hello", String.class);
method02.invoke(stu03, "小亮");
/*用getDeclaredMethod获取add在用stu3对象调用hello有参构造里的中方法*/
Method method3 = clzz01.getDeclaredMethod("add", Integer.class,Integer.class);
method3.setAccessible(true);
Integer he = (Integer)method3.invoke(stu03, 3,4);
System.out.println("3+4="+he);
1437

被折叠的 条评论
为什么被折叠?



