Java反射
声明:本文记录基于 JDK 8(8u211)的继承使用规则如果存在错误,请发邮件至2623574740@qq.com 联系我
创作时间:2023-09-16 17:00:21
创作情况:失业第46天,地处成都金牛区
创作者:一口吃不成胖子
反射
准备工作,以供对照描述与代码,想看结论直接到文末尾
父类
package com.beans;
/**
* 抽象父类 Animal
*
* */
abstract class Animal {
public String AnimalName;
public Integer AnimalAge;
public void desc(){
System.out.println(this.AnimalName+"---"+this.AnimalAge);
}
abstract public void bark();
}
子类
package com.beans;
public class Cat extends Animal {
public Cat(){
}
private Cat(String petName){
this.petName = petName;
}
private Cat(Double price){
this.price = price;
}
public Cat(String petName,Double price){
this.petName = petName;
this.price = price;
}
private String petName;
private Double price;
@Override
public void bark() {
System.out.println("喵");
}
public void catDesc(){
System.out.println(this.AnimalName+"+++"+this.AnimalAge);
}
}
获取类
-
Class.forName(全类名)
-
类名.class
Class animalClass = Class.forName("com.beans.Cat");
class catClass = Cat.class;
获取构造器
- getDeclaredConstructors():获取本类所有构造器
- getDeclaredConstructor(参数类...):获取本类所有构造器的某一个
- getConstructors():获取本类中public修饰的构造器
- getConstructor(参数类...):获取本类public修饰的构造器中的符合参数的顺序和类型构造器
- newInstance(参数...):调用构造器实例化对象
Constructor con = animalClass.getConstructor(null);//获取指定的且被public修饰的构造方法
Cat miao = (Cat) con.newInstance(null);// 实例化对象
Constructor[] constructors = animalClass.getDeclaredConstructors();//获取所有构造对象,包括被private修饰的
for (Constructor constructor : constructors) {
System.out.println(constructor.getParameterCount());
Parameter[] parameters = constructor.getParameters();//获取构造方法参数
for (Parameter parameter : parameters) {
System.out.println(parameter.getName()+"--"+ parameter.getType());
}
}
获取方法
- getDeclaredMethods():获取所有方法,不包括继承父类的,但包括重写的。
- getDeclaredMethod(方法名,参数类...):获取所有方法中的某个方法,不包括继承父类的,但包括重写的。
- getMethods():获取所有public修饰的方法,包括继承父类的public方法
- getMethod(方法名,参数类...):获取public修饰的方法中的某个方法,包括继承父类的public方法
- getParameters():获取方法的所有参数
- invoke(对象,参数...):执行对象
- setAccessible(布尔):放开/禁止可访问权限(仅类中是public修饰的方法不用调用此方法,访问继承于父类中是public修饰的方法则需要调用)
Method[] methods = animalClass.getDeclaredMethods();//获取所有方法
for (Method method : methods) {
int parameter_count = method.getParameterCount();//获取参数个数
System.out.println(method.getName()+"---"+parameter_count);
for (Parameter parameter : parameters) {
String para_name = parameter.getName();//并不是真正的参数名,而是arg0,arg1...
Type type = parameter.getType();
System.out.println(para_name+"---"+type.getTypeName());//打印参数名和参数类型
}
Parameter[] parameters = method.getParameters();//获取参数
if ( parameters.length == 0){
method.invoke((Cat)animalClass.newInstance());//执行方法
}
}
获取属性
- getFields():获取所有public修饰的属性,包括继承于父类的。
- getField(属性名):获取public修饰的属性中某个属性,包括继承于父类的。
- getDeclaredFields():获取所有属性,不包括父类的。
- getDeclaredField(属性名):获取所有属性中某个属性,不包括父类的。
- set(对象,值):为某一个对象的该属性赋值
- get(对象):获取对象的该属性值。
- setAccessible(布尔):放开/禁止可访问权限(仅类中是public修饰的属性不用调用此方法,访问继承于父类中是public修饰的属性则需要调用)
Field[] fields = animalClass.getFields();
for (Field field : fields) {
System.out.println(field.getName()+"---"+field.getType());
}
Field f = animalClass.getField("AnimalName");// 获取public修饰的AnimalName属性
Cat cat = (Cat) animalClass.newInstance();
f.setAccessible(true);// 放开权限,因为AnimalName是从父类中继承的public属性,需要打开访问权限
f.set(cat,"小毛");//赋值
System.out.println(f.get(cat));//取值
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/p/17708306.html