1.使用对象的 getClass() 方法,如var person = new Person;person.getClass();
2.使用 .class,如int.class;Person.class;
3.使用 Class.forName()添加Class对象的路径。如Class.forName("com.google.mybatis");
1.getName();获取Class对象全限定类名 比如"com.apple.test"
2.getSimpleName();直接获取对象的名字,不包含包名,比如"test"
注:如果是数组类型的话,getName()是在前面加上[,
String[].class.getName();
返回的就是
[Ljava.lang.String
(其中的L代表的是在java内部的命名规则中的代表类或者接口的形式,如果是int[]则是返回的[I)
而getSimpleName()是在后面加上对应维度的[]
如
String[][][].class.getSimpleName();
String[][][]
还有一个 getCanonicalName()返回官方名字,如果官方名字不存在就会返回null(局部类和匿名内部类不存在官方名字)
getModifiers()
public class Test{}
Test.class.getModifiers()
此时返回的是一个数(1),在java内部都是通过数字代表着不同的修饰符,此时我们需要通过Modifier.toString()方法把该数值转换成字符串
getDeclaredField(),可以获取到被private修饰的属性,不能从父类获取属性
getField(),可以获取到非private修饰的属性,如果是当前类中不含有该属性,但是有父类存在的话,会从父类中寻找是否存在该属性
getDeclaredFields() ,注意这里多了一个s,该方法的意义在于获取所有的属性,但是不包含从父类继承过来的属性
getFields(),获取自身的所有public修饰的属性,并且包括从父类继承过来的
getDeclaredMethod(String name, Class<?>... parameterTypes),获取到Class对象中的private修饰的方法,不包括父类(第一个参数方法名,第二个参数填写方法的参数,个数是不定的,根据方法的参数个人来确定,并且传入的参数类型都必须是.class类型的)
//如下所示
Method methodtest = class1.getDeclaredMethod("test",int.class,float.class);
//如果是方法的参数过多可以采取如下形式
Method methodtest = class1.getDeclaredMethod("test",new Class[]{int.class,float.class});
getMethod(String name, Class... parameterTypes),获取到Class对象中的非private修饰的方法,包括父类getDeclaredMethods() throws SecurityException,获取本Class中的所有方法,不包含从父类继承过来的getMethod(String name, Class... parameterTypes),获取本Class中的所有Public修饰的方法,包括从父类继承过来的public Constructor getDeclaredConstructor(Class... parameterTypes),获取到被private修饰的构造方法
public Constructor getConstructor(Class... parameterTypes),获取到被非private修饰的构造方法
public Constructor[] getDeclaredConstructors() throws SecurityException,获取到所有的构造方法
public Constructor[] getConstructors() throws SecurityException ,获取到被public修饰的构造方法
Constructor 不能从父类继承,所以就没有办法通过 getConstructor() 获取到父类的 Constructor。
getGenericType(),获取泛型属性类型
getType(),获取属性类型
getModifiers()获取属性的修饰符
public Object get(Object obj)获得属性的值,参数填写要获取值的对象(该方法有一系列的值在此不多多列举,可以参考官方文档)
public void set(Object obj, Object value);设置属性的值,第一个参数填写设置值的对象,第二个值填写要设置的值
【注:】
如果访问的值是private的,通过get获取值的时候会报错java.lang.IllegalAccessException: Class com.xxx.xxx.xxx can not access a member of class com.xx.xx.x with modifiers "private"
此时只需要添加该代码,boolean值设置为true,即可解决setAccessible(true);
getName() 获取方法名
public Parameter[] getParameters()获取到方法的参数
public String getName()获取参数名字
public Class getType()获取参数类型
public int getModifiers()获取参数的修饰符
public Class[] getParameterTypes() 获取所有的参数类型
public Type[] getGenericParameterTypes() 获取所有的参数类型,包括泛型
代码操作如下所示
Class<Car> carClass = Car.class;
Method[] declaredMethods = carClass.getDeclaredMethods();
for (Method m: declaredMethods) {
System.out.println("方法名字:"+m.getName());
Parameter[] parameters = m.getParameters();
for (Parameter p:parameters) {
System.out.println("参数名字:"+p.getName()+"参数类型:"+p.getType());
}
Class[] parameterTypes = m.getParameterTypes();
System.out.println("方法参数类型————————");
for (Class type:parameterTypes) {
System.out.println(" "+type.getName());
}
public Class<?> getReturnType()获取返回值类型
public Type getGenericReturnType()获取返回值类型包括泛型
Class<Car> carClass = Car.class;
Method[] declaredMethods = carClass.getDeclaredMethods();
for (Method m:declaredMethods) {
System.out.println("方法的返回值类型:"+m.getReturnType());
System.out.println("方法的泛型返回值类型:"+m.getGenericReturnType());
方法的返回值类型:class java.lang.String
方法的泛型返回值类型:class java.lang.String
方法的返回值类型:class java.lang.String
方法的泛型返回值类型:class java.lang.String
方法的返回值类型:void
方法的泛型返回值类型:void
public int getModifiers();获取方法修饰符
public Class<?>[] getExceptionTypes() 获取异常类型
public Type[] getGenericExceptionTypes()获取泛型异常类型
public Object invoke(Object obj, Object... args)
该方法可以执行你通过反射得到的Class对象的方法,第一个Object参数是传入要调用方法的初始化之后的对象,第二个参数传入调用该方法所需要用到的的实际参数,静态方法中第一个参数为空,如果调用的方法不需要传入参数,那么直接为null;
//测试静态方法的执行
Method testStatic = testMethodClass.getMethod("testStatic", null);
try {
testStatic.invoke(null, null);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
public class TestMethod {
private int add (int a,int b ) {
return a + b;
}
TestMethod testMethod = new TestMethod();
//测试有参方法的执行
Method add = testMethodClass.getDeclaredMethod("add", int.class, int.class);
add.setAccessible(true);
int result = 0;
try {
result = (int) add.invoke(testMethod, 1, 2);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("add方法执行的结果result="+result);
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。休息休息一下,未完待续!!
本文档一部分内容来自于 https://blog.csdn.net/briblue/article/details/74616922