























原文:https://ichochy.com/posts/java/20200823.html
反射可以在代码运行时,动态的获取对象、调用方法、设置属性。动态操作,降低代码偶合性,提高灵活度。其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();
获取全部
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);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。