package cn.zzsxt.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
*java.lang.Class类:继承了Object类,描述了类的相关信息,是java反射机制的入口。
*一个类中信息常见的组成:
*构造函数:无,不能通过new关键创建Class对象,一般通过Class.forName(全类名)获取Class对象;
*常用方法:
* getDeclaredFields():返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
* getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
getDeclaredConstructors()
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法
getModifiers():返回类的修饰符。0代表默认,1代表public
getSimpleName():返回简单类名,不包含包名。
getName():返回全类名,包含包名。
getSuperclass():返回父类类型
getInterfaces():返回实现的接口类型
*1.成员变量或属性:Field
* getModifiers():返回属性的修饰符。0代表默认,1代表public,2代表private,4代表protected
* getType():返回属性的类型
* getName():返回属性名称
*2.成员方法:Method
* getModifiers():返回方法的修饰符
* getReturnType():返回方法的返回值类型
* getName():返回方法名
* getParameterTypes():返回方法的参数类型
* getExceptionTypes():返回方法声明的异常类型
*3.构造方法:Constructor
* getModifiers():返回构造方法的修饰符
* getName():返回构造方法名
* getParameterTypes():返回构造方法的参数类型
*
*/
public class TestClass {
/**
* 获取类的相关信息
*/
public void testClassinfo(){
try {
Class clazz = Class.forName("cn.zzsxt.entity.Student");
Package pack =clazz.getPackage();
System.out.println(pack.getName());
// String clazzName = clazz.getName(); //包名+类名
int modify = clazz.getModifiers();//获取类的修饰符
String simpleName = clazz.getSimpleName();//类名
Class superClazz = clazz.getSuperclass();//获取父类
Class[] interfaceClazz = clazz.getInterfaces();//获取实现的接口
System.out.println("修饰符:"+modify);
System.out.println("类名:"+simpleName);
System.out.println("继承的父类:"+superClazz);
System.out.println("实现的接口:"+Arrays.toString(interfaceClazz));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取属性信息
*/
public void testField(){
try {
//获取Student对象对应的Class信息
Class clazz = Class.forName("cn.zzsxt.entity.Student");//动态加载一个类参数应该为该类的全类名(包名+类名)
Field[] fs = clazz.getDeclaredFields();//获取该类中的属性信息
for (Field field : fs) {
int modifer = field.getModifiers();//获取修饰符 1:public,2:private,4:protected 0:默认
Class fieldClass = field.getType();//获取属性的类型
String fieldName = field.getName();//获取属性名称
System.out.println(modifer+"---"+fieldClass+"---"+fieldName);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取方法信息
*/
public void testMethod(){
try {
Class clazz = Class.forName("cn.zzsxt.entity.Student");//动态加载一个类参数应该为该类的全类名(包名+类名)
Method[] ms = clazz.getDeclaredMethods();//获取类中的方法信息
for (Method method : ms) {
int modify = method.getModifiers();//获取方法的修饰符
Class returnTypeClass = method.getReturnType();//获取方法的返回值类型
String methodName = method.getName();//获取方法名
Class[] paramClazz = method.getParameterTypes();//获取参数类型
Class[] exceptionClazz = method.getExceptionTypes();//获取异常类型
System.out.println(modify+"---"+returnTypeClass+"---"+methodName+"---"+Arrays.toString(paramClazz)+"---"+Arrays.toString(exceptionClazz));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取构造函数
*/
public void testConstructor(){
try {
Class clazz = Class.forName("cn.zzsxt.entity.Student");
Constructor[] cs= clazz.getConstructors();
for (Constructor constructor : cs) {
int modify = constructor.getModifiers();//获取构造函数的修饰符
String constructorName = constructor.getName();//获取构造函数的名称
Class[] paramClazz = constructor.getParameterTypes();//获取构造函数的参数
System.out.println(modify+"---"+constructorName+"---"+Arrays.toString(paramClazz));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestClass test = new TestClass();
test.testClassinfo();
// test.testField();
// test.testMethod();
// test.testConstructor();
}
}
Constructor
* java.lang.reflect.Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。
* getModifies():获取构造函数的修饰符
* getName():获取构造函数的名称
* getParameterTypes():获取构造函数的参数类型
*调用无参构造和有参构造的方式:
*无参构造:Class.forName(...).newInstance()
*有参构造:
*1.获取有参构造方法的Constructor对象
* Class clazz = Class.forName("cn.zzsxt.entity.Student");
Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class,double.class
2.调用newInsatnce(Object...objs)方法创建对象
Object obj = constructor.newInstance("zhangsan",23,80);
public class TestConstructor {
public static void main(String[] args) throws Exception{
// Student student = new Student();
// Class.forName("cn.zzsxt.entity.Student").newInstance();//相当于调用无参构造函数创建对象
// Student student = new Student("zhangsan",23,80);
Class clazz = Class.forName("cn.zzsxt.entity.Student");
Constructor constructor = clazz.getDeclaredConstructor(String.class,int.class,double.class);
Object obj = constructor.newInstance("zhangsan",23,80);
System.out.println(obj);
}
}
Field
* java.lang.reflect.Field类:Field提供有关类或接口的单个字段的信息,以及对它的动态访问权限。
* getName():获取属性名称
* getType():获取属性类型
* getModifies():获取修饰符
* set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
* get(Object obj) 返回指定对象上此 Field 表示的字段的值。
public class TestField {
public static void main(String[] args) throws Exception{
// Student student = new Student();
// student.setName("zhangsan");
// student.getName();
Class clazz = Class.forName("cn.zzsxt.entity.Student");
Object obj = clazz.newInstance();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);//设置访问控制,true为可以访问private修饰的属性
field.set(obj, "zhangsan");//赋值
System.out.println(field.get(obj));//取值
}
}
Method
* java.lang.reflect.Method类:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息
* getModifiers() :获取修饰符
* getReturnType():获取返回值类型
* getName():获取方法名
* getParameterTypes():获取方法的参数列表类型
* getExceptionTypes():获取异常类型
*
* invoke(Object obj, Object... args) ***:对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
public class TestMethod {
public static void main(String[] args) throws Exception{
// Student student = new Student();
// student.setName("zhangsan");
// student.getName();
Class clazz = Class.forName("cn.zzsxt.entity.Student");
Object obj = clazz.newInstance();
Method setterMethod = clazz.getMethod("setName", String.class);
//回调方法student.setName("zhangsan")
setterMethod.invoke(obj, "zhangsan");//第一个参数为对象,第二个参数为方法的参数值
Method getterMethod =clazz.getMethod("getName", null);
//回调方法:student.getName();
Object result = getterMethod.invoke(obj, null);
System.out.println(result);
}
}
*