一、先来说一说什么是反射机制
Java反射机制是指在运行状态中,动态获取信息以及动态调用对象方法的功能。
二、Java反射有三个动态性质
运行时生成对象实例
运行期间调用方法
运行时更改属性
三、关键步骤如下
使用反射获取类的信息
使用反射创建对象
使用反射访问属性和方法
四、反射常用的方法
getDeclaredConstructors(): 返回Class对象锁包含类的所有构造方法
getDeclaredFields(): 返回此Class对象所包含类的的全部属性
getInterfaces(): 返回该Class对象对应类所实现的全部接口
getSuperclass(): 返回该Class所表示的父类对应的Class对象
getDeclaredMethod 返回该Class对象所包含的类的全部方法
invote 执行对象方法
五、实现
举个简单的例子
public class TestReflect<T> {
public static void main(String[] args) throws Exception{
// 1,获取类型Class
Class<Student>sc =Student.class;
// Student s=new Student();//由于s的类型不能确定具体的对象地址(可能是子类类型)所以用?
// Class<? extends Student> sc1=s.getClass();//使用对象.getclass()
// Class<?> sc2=Class.forName("cn.student");
//2,获取构造方法,并且创造对象(上述所有获取类型的方法,最常用的是最后一个)
Constructor<Student>c=sc.getDeclaredConstructor(int.class,double.class,String.class);//获取构造方法
c.setAccessible(true);//强行获取访问权限
Student s=c.newInstance(1,1.5,"王撕葱");//通过构造方法创建对象s
System.out.println(s.getName());
//3,使用对象构造方法
Method method = sc.getDeclaredMethod("setStuNo", int.class);
method.setAccessible(true);//强行获取权限
Object o = method.invoke(s, 15);
System.out.println(s);
System.out.println(o);
//4、使用对象强行对属性赋值(如果只有私有属性,没有方法)
Field stuNo = sc.getDeclaredField("stuNo");//通过属性名获取
stuNo.setAccessible(true);
stuNo.set(s,18);
System.out.println(s);
//5,获取父类
Class<? super Student> suc = sc.getSuperclass();//获取父类的Class对象
Constructor<? super Student> cs = suc.getConstructor();//获取父类默认的构造方法
Object object = cs.newInstance();
System.out.println(object);
Method think = suc.getMethod("think");
think.invoke(object);
//6,获取接口
Class<?>[] i = sc.getInterfaces();
Class<?> inter = i[0];//获取父接口
}
}
子类
public class Student extends Human implements Talkable {
public int stuNo;
private double score;
@Override
public String toString() {
return "Student{" +
"stuNo=" + stuNo +
", score=" + score +
'}';
}
private Student(){
}
public Student( int stuNo, double score) {
this.stuNo = stuNo;
this.score = score;
}
private Student( int stuNo, double score,String name) {
setName(name);
this.stuNo = stuNo;
this.score = score;
}
private int getStuNo() {
return stuNo;
}
private void setStuNo(int stuNo) {
this.stuNo = stuNo;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
父类
public class Human {
public Human() {
}
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Human(String name) {
this.name = name;
}
public void think(){
System.out.println("胡乱想");
}
}
接口
package cn;
public interface Talkable {
}
Java反射机制详解
本文深入介绍了Java反射机制的概念及其三个核心动态特性:运行时生成对象实例、调用方法及更改属性。通过具体示例展示了如何使用反射API获取类信息、创建对象、访问属性和方法等。同时,还涉及了反射中常用的API方法。
1041

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



