反射可以在代码运行时,动态的获取对象、调用方法、设置属性。动态操作,降低代码偶合性,提高灵活度。其JDBC
库就是通过反射加载。
实例操作
以操作User
对象为例:
/*
* File:User.java
* User:iChochy
* URL:https://ichochy.com
* Copyright (c) 2020
* Date:2020/08/31 10:18:31
*/package com.ichochy.example;
public class User {
private String name = ”iChochy“;
private int age = 32;
private String url = ”https://ichochy.com“;
public void display(){
System.out.println(”Name:“+name);
System.out.println(”Age:“+age);
System.out.println(”URL:“+url);
}
}
正常调用
User user = new User();
user.display();
获取对象 类动态获取
//获取类
Class> clazz = User.class;
//获取对象
Object obj = clazz.newInstance();
类路径获取
//获取类
Class> clazz = Class.forName(”com.ichochy.example.User“);
//获取对象
Object obj = clazz.newInstance();
获取属性 【Java 反射实例操作】获取全部
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
System.out.println(field.getName());
//name、age、url
}
属性名获取
Field field = clazz.getDeclaredField(”age“);
System.out.println(field.getName());
//age
设置属性
Object obj = clazz.newInstance();
Field field= clazz.getDeclaredField(”age“);
//获取私用属性
field.setAccessible(true);
//设置反射访问权限检查
System.out.println(field.get(obj));
//32
field.set(obj,18);
//设置属性
System.out.println(field.get(obj));
//18
获取方法 获取全部
Method[] methods = clazz.getMethods();
for(Method method:methods){
System.out.println(method.getName());
//display
}
方法名获取
Method method = clazz.getMethod(”display“);
System.out.println(method.getName());
//display
调用方法
Object obj = clazz.newInstance();
Method[] methods = clazz.getMethods();
for(Method method:methods){
//调用 display 方法
if(”display“.equals(method.getName())){
method.invoke(obj);
}
}
方法名调用
Object obj = clazz.newInstance();
Method method = clazz.getMethod(”display“);
method.invoke(obj);
相关文章
- Java 中的重写(Override)与重载(Overload) 2020/08/20
- 免费申请 JetBrains 开源开发许可证,包含 IDEA 2020/08/19
- Java 开发环境的搭建,开启你的编程之旅2020/08/15
请帮忙点赞、转发!