对反射的一些理解笔记
反射的知识点
1:什么是反射
反射是框架完成的核心。那什么又是框架呢?框架是一个半完成品的程序,在开发项目的时候可以直接拿来用。用于提高效率
反射就是把java类中的各个成分映射成一个个的java对象。
2:获取反射的Class
注意:java中,无论生成每个类的多少个对象,这些对象都会对应于同一个Class对象。(一个类的字节码指挥被加载一次)
从上述分析可知,任意一个字码节都会通过ClassLoader类加载器,加载到JVM内存中,以Class对象的形式存在。
常见的获取Class对象的方式有三种:
第一种 | Class.forName("类路径") |
第二种 | 类名.class |
第三种 | 对象.getClass(); |
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
// 第一种:根据user类路径获取user的反射对象
Class<?> aClass = Class.forName("demo4.User");
System.out.println(aClass);
// 第二种:根据类名获取user类的反射对象
Class<User> userClass =User.class;
System.out.println(userClass);
// 通过类对象获取类的反射对象
User user = new User();
Class<? extends User> aClass1 = user.getClass();
System.out.println(aClass1);
//判断是否为同一个Class对象
System.out.println(aClass==userClass);
System.out.println(userClass==aClass1);
}
}
class User{
private String users;
private Integer pwd;
public String getUsers(){
return users;
}
public void setUsers(String users){
this.users=users;
}
public Integer getPwd() {
return pwd;
}
public void setPwd(Integer pwd) {
this.pwd = pwd;
}
}
结果展示:
3:通过反射获取反射类对象
通过Class类对象,调用newiInstance()
public class Test {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<User> aClass2 =(Class<User>)Class.forName("demo4.User");
// 通过反射类的到对应的类对象---之前的方式:new USer 来获取User类的对象
User user1 = aClass2.newInstance();
User user2 = aClass2.newInstance();
System.out.println(user2==user1);
System.out.println(user1);
}
}
class User{
private String users;
private Integer pwd;
public String getUsers(){
return users;
}
public void setUsers(String users){
this.users=users;
}
public Integer getPwd() {
return pwd;
}
public void setPwd(Integer pwd) {
this.pwd = pwd;
}
}
spring根据你传递的类路径--得到该类的反射类---并通过newInstance()创建类对象
4:
public class Test2 {
public static void main(String[] args) throws NoSuchFieldException {
// 获取docter反射类
Class<Docter> docterClass = Docter.class;
// 获取反射类中的成员对象
Field[] declaredFields = docterClass.getDeclaredFields();//获取本类中的所有属性对象
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("=================");
Field[] fields = docterClass.getFields();//获取本类以及父类中的public对象
for (Field field : fields) {
System.out.println(field);
}
Field x = docterClass.getField("y");
System.out.println(x);
}
}
class People{
private String x;
public String y;
}
class Docter extends People{
private String name;
public String pwd;
String sex;
@Override
public String toString() {
return "Docter{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show(){
System.out.println("姓名:"+name);
}
}
public class Test3 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
// 获取反射类对象
Class<Teather> teatherClass = Teather.class;
// 通过了反射对象获取类对象
Teather teather = teatherClass.newInstance();
System.out.println(teather);
// 得到类对象中的属性
Field declaredField = teatherClass.getDeclaredField("age");
declaredField.set(teather,18);//通过set属性对象为Teather对象赋值
System.out.println(teather);
Field name = teatherClass.getDeclaredField("name");
// 允许访问私有属性
name.setAccessible(true);
name.set(teather,"张飞");
System.out.println(teather);
}
}
public class Test4 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException {
// 获取反射类对象
Class<Hello> helloClass = Hello.class;
// 获取hello对象
Hello hello = helloClass.newInstance();
// 获取本类中所有的Method方法对象
Method[] declaredMethods = helloClass.getDeclaredMethods();
for (Method method : declaredMethods) {
System.out.println(method);
}
Method sun= helloClass.getMethod("sun",int.class);
System.out.println(sun);
}
// 得到本类以及父类中的public修饰的方法对象
}
public class Test5 {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
// 获取反射类对象
Class<Word> wordClass = Word.class;
// 获取hello对象
Word word = wordClass.newInstance();
Method sun= wordClass.getMethod("sun",int.class,String.class);
//invoke回调执行该方法 执行方法 word指的调用的方法对象
Object result = sun.invoke( word,15,"123");
System.out.println(result);
MyWord annotation = sun.getAnnotation(MyWord.class);
System.out.println(annotation.value());
}
}
public class Test06 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException {
Class<?> aClass = T.class;
// 它只能得到本类中public的构造函数
Constructor<?>[] constructor = aClass.getConstructors();
for (Constructor<?> declaredConstructor : constructor) {
System.out.println(declaredConstructor);
}
}
}
public static void main(String[] args) throws Exception {
Class<?> aClass = S.class;
//得到无参构造函数
// Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
// Object o = declaredConstructor.newInstance();
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);
Object world = declaredConstructor.newInstance("hello world");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)