Java中最強大的技術之一 反射 獲取子父類方法及屬性
- 前言
- 1、 clazz.getFields()獲取成員變數
- 2、 clazz.getDeclaredFields()獲取當前類的所有屬性
- 3、 clazz.getMethods()獲取當前物件及父類物件的所有公共方法
- 4、 clazz.getDeclaredMethods()獲取當前類中所有的方法
- 5、反射 給屬性賦值并列印
- 6、反射 呼叫方法
- 7、 clazz.getConstructors()獲取物件的所有構造方法
- 8、 clazz.getDeclaredConstructors()獲取所有的構造方法
- 9、如何呼叫私有的構造方法呢?
- Student 類
- Person 類
前言
反射在一定程度上破壞了封裝性,需要合理使用
Student類 extends Person類
兩個類的代碼在文章最下方
1、 clazz.getFields()獲取成員變數
獲取成員變數,包括子類及父類,同時只能包含公共(public)屬性
Class<?> clazz = Class.forName("com.mashibing.reflect.Student");
//獲取成員變數,包括子類及父類,同時只能包含公共的方法
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field);
System.out.println(field.getName());
System.out.println(field.getType());
System.out.println(field.getModifiers());
System.out.println("-----");
}
2、 clazz.getDeclaredFields()獲取當前類的所有屬性
此方法回傳的是當前類的所有屬性,不僅僅局限于公共訪問修飾符,所有的訪問修飾符都可以拿到
Class<?> clazz = Class.forName("com.mashibing.reflect.Student");
Field[] declaredFields = clazz.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField.getName());
}
3、 clazz.getMethods()獲取當前物件及父類物件的所有公共方法
獲取該物件的普通方法,包含的方法范圍是當前物件及父類物件的所有公共方法
Class.forName("com.mashibing.reflect.Student");
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
4、 clazz.getDeclaredMethods()獲取當前類中所有的方法
獲取當前類中所有的方法,無論什么訪問修飾符
Class.forName("com.mashibing.reflect.Student");
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
5、反射 給屬性賦值并列印
一定要加address.setAccessible(true),設定該屬性是否能被訪問
Class.forName("com.mashibing.reflect.Student");
Field address = clazz.getDeclaredField("address");
//設定該屬性是否能被訪問,true表示能被訪問,破壞了封裝性
address.setAccessible(true);
System.out.println(address.getName());
//newInstance默認會呼叫類的無參構造方法
// 以后在使用框架的時候,類一定記得加無參構造方法,因為其底層可能就會呼叫
Object o = clazz.newInstance();
address.set(o,"北京市");
System.out.println(((Student)o).getAddress());
6、反射 呼叫方法
一定要加address.setAccessible(true),設定該屬性是否能被訪問
Class.forName("com.mashibing.reflect.Student");
Method add = clazz.getDeclaredMethod("add", int.class, int.class);
add.setAccessible(true);
Object o1 = clazz.newInstance();
add.invoke(o1,123,123);
7、 clazz.getConstructors()獲取物件的所有構造方法
獲取物件公有的構造方法,且不包括父類的構造方法
Class.forName("com.mashibing.reflect.Student");
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor.getName());
}
8、 clazz.getDeclaredConstructors()獲取所有的構造方法
獲取所有的構造方法,無論是私有還是公有
Class.forName("com.mashibing.reflect.Student");
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor.getName());
}
9、如何呼叫私有的構造方法呢?
Class.forName("com.mashibing.reflect.Student");
Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class, String.class);
declaredConstructor.setAccessible(true);
Student o2 = (Student)declaredConstructor.newInstance("msb", 23, "java");
System.out.println(o2);
Student 類
public class Student extends Person{
public String className;
private String address;
public Student(){
super();
}
private Student(String name,int age,String className){
super(name,age);
this.className= className;
}
public Student(String name,int age,String className,String address){
super(name,age);
this.className = className;
this.address = address;
}
private void add(int a,int b){
System.out.println(a+b);
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"className='" + className + '\'' +
", address='" + address + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
Person 類
public class Person {
public String name;
public int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String show(){
return "name:"+name+", age :"+age;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258406.html
標籤:java
上一篇:java 函式
