一、Java反射机制具体是什么( 二 )


文章插图
com.example.res.util
三、获取到Class类能做些什么 1.获取所有类的信息
这里主要介绍两种方法
其中 () 获取到的是隐式调用的Class参数对应类的本类及父类的变量;
() 获取到的是隐式调用的Class参数的对应类的所有变量,包含、权限的变量,但不包含父类的变量
举例如下:
.class
package com.qjy.javabasicpractice.string.bean;public class Employee {public String Name;public int age;public boolean isMale;private double salary;public String getName() {return Name;}public void setName(String name) {Name = name;}public Employee(){this("Julian",20, true, 2000.00);}public Employee(String name, int age, boolean isMale, double salary) {Name = name;this.age = age;this.isMale = isMale;this.salary = salary;}public int getAge() {return age;}public Employee(int age, boolean isMale, double salary) {this.age = age;this.isMale = isMale;this.salary = salary;}public void setAge(int age) {this.age = age;}public boolean isMale() {return isMale;}public void setMale(boolean male) {isMale = male;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}}
.class
package com.qjy.javabasicpractice.string.bean;public class Manager extends Employee {private double bonus;public Manager(String name, int age, boolean isMale, double salary, double bonus) {super(name, age, isMale, salary);this.bonus = bonus;}public Manager() {this("ZhangSan",55,true,20000.00,2000);}public void ReportSalary(){double moneyAll=getSalary()+bonus;System.out.println("这季度的总和是"+moneyAll);}}
.class
package com.qjy.javabasicpractice.string.reflection;import com.qjy.javabasicpractice.string.bean.Employee;import com.qjy.javabasicpractice.string.bean.Manager;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Modifier;public class ReflectionTest {public static void main(String[] args) {/*** 获取Class类的三种方式*/Employee employee = new Employee("Julian",20, true, 2000.00);//getClass()方法Class aClass = employee.getClass();//Class.forName()方法String name = aClass.getName();Class bClass = null;try {bClass = Class.forName(name);} catch (ClassNotFoundException e) {e.printStackTrace();}//T.class;Class cClass=Employee.class;//获取Manager ClassClass dClass=Manager.class;Object object1 = null;try {object1 = dClass.getConstructor().newInstance();} catch (Exception e) {e.printStackTrace();}if (object1 instanceof Manager) {System.out.println("That object is Manager");}printFieldsAll(dClass);}public static void printFieldsAll(Class mClass){System.out.println("This Class name is "+mClass.getName());//2.1 获取所有 public 访问权限的变量// 包括本类声明的和从父类继承的//Field[] fields = mClass.getFields();//2.2 获取所有本类声明的变量(不问访问权限)Field[] fields = mClass.getDeclaredFields();//3. 遍历变量并输出变量信息for (Field field : fields) {//获取访问权限并输出int modifiers = field.getModifiers();System.out.print(Modifier.toString(modifiers) + " ");//输出变量的类型及变量名System.out.println(field.getType().getName()+ " " + field.getName());}}}
输出结果
2.获取所有类的方法
类比获取变量,获取类方法主要有以下两个函数:
代码如下:
public static void printMethodsAll(Class mClass){//1.获取并输出类的名称System.out.println("类的名称:" + mClass.getName());//2.1 获取所有 public 访问权限的方法//包括自己声明和从父类继承的Method[] mMethods = mClass.getMethods();//2.2 获取所有本类的的方法(不问访问权限)//Method[] mMethods = mClass.getDeclaredMethods();//3.遍历所有方法for (Method method :mMethods) {//获取并输出方法的访问权限(Modifiers:修饰符)int modifiers = method.getModifiers();System.out.print(Modifier.toString(modifiers) + " ");//获取并输出方法的返回值类型Class returnType = method.getReturnType();System.out.print(returnType.getName() + " "+ method.getName() + "( ");//获取并输出方法的所有参数Parameter[] parameters = method.getParameters();for (Parameter parameter:parameters) {System.out.print(parameter.getType().getName()+ " " + parameter.getName() + ",");}//获取并输出方法抛出的异常Class[] exceptionTypes = method.getExceptionTypes();if (exceptionTypes.length == 0){System.out.println(" )");}else {for (Class c : exceptionTypes) {System.out.println(" ) throws "+ c.getName());}}}}