//辅助类
public class Student{
String name;
public Student() {
}
public Student(String name) {
this.name=name;
}
public static int doHomework(int a, String name) {
System.out.println("正在做作业");
return a;
}
}
构造方法
1、获取构造方法
-
①Constructor[] getConstrutors():返回该Class对象表示类包含的所有public构造方法(不含继承)所对应Constructor对象数组。
-
②Constructor getConstrutor(Class<?>… parameterTypes):返回与该Class对象表示类中参数列表相匹配的public构造函数(不含继承)对应的Constructor对象。
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;//获取类
Constructor constructor=clazz.getConstructor();//获取类中的构造方法
System.out.println(constructor.getName());
constructor=clazz.getConstructor(String.class);//获取类中第二种构造方法
System.out.println(constructor.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
-
③Constructor<?>[] getDeclaredConstructors():返回一个该Class对象表示类中声明的所有构造方法(不区分访问权限)对应的Constructor对象数组。
-
④Constructor getDeclaredConstructor(Class<?>… parameterTypes):返回与该Class对象表示类中定义的形参类型相匹配的构造方法(不区分访问权限:如果把Student类中的构造方法访问权限改为非public的权限也不影响)的Constructor对象。
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;//获取类
Constructor constructor=clazz.getDeclaredConstructor();//获取类中的构造方法
System.out.println(constructor.getName());
constructor=clazz.getDeclaredConstructor(String.class);//获取类中第二种构造方法
System.out.println(constructor.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、获取构造方法信息
- ①Class getDeclaringClass():返回声明Constructor对象对应构造方法的类的Class对象。
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Constructor constructor=clazz.getDeclaredConstructor();
clazz=constructor.getDeclaringClass();//获取构造方法所属的类信息
System.out.println(clazz.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
- ②int getModifiers():以整数形式返回Constructor对象表示的构造函数的修饰符。
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Constructor constructor=clazz.getDeclaredConstructor();
int a=constructor.getModifiers();//获取访问权限修饰符,并接收返回值
String result=Modifier.toString(a);//比对返回值并接收返回的访问权限字符串
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
- ③String getName() :以字符串形式返回Constructor对象所表示得构造方法的名称。
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Constructor constructor=clazz.getDeclaredConstructor();
System.out.println(constructor.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
- ④Class<?>[] getParameterTypes():返回由Constructor对象所表示的构造方法的形参类型对应Class对象组成的数组此 。如果构造方法没有参数,则数组长度为0。
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Constructor constructor=clazz.getDeclaredConstructor();
Class[] clazzs =constructor.getParameterTypes();//得到参数列表存入数组中
for (Class s : clazzs) {//加强循环遍历该数组,输出参数列表所涉及的参数类
System.out.println(s.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、操作构造方法 —— 创建对象
- ①void setAccessible(boolean flag):调用构造函数时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
- ②newInstance(Object… initargs):使用此Constructor对象表示的构造方法来创建声明该构造方法类的新对象。initargs为传入该构造方法中的参数,如果该构造方法没有参数,则可设定为null或一个长度为0的数组。
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Constructor constructor=clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
Object obj=constructor.newInstance("fsr");
Student stu=(Student)obj;
} catch (Exception e) {
e.printStackTrace();
}
}
}
属性
1、获取属性
-
①Field[] getFields():返回一个该Class对象表示类或接口中所有public属性(含继承的)对应的Field对象数组
-
②Field getField(String fieldName):返回该Class对象表示类或接口中与指定属性名(含继承的)相同的public 属性对应的Field对象
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
clazz.getField("name");//获取成员变量
} catch (Exception e) {
e.printStackTrace();
}
}
}
-
③Field[] getDeclaredFields():返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组
-
④Field getDeclaredField(String fieldName) :返回一个与该Class对象表示类或接口内定义的属性名(不含继承的)相匹配的属性相对应的Field对象
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
clazz.getDeclaredField("name");//获取成员变量(无论访问权限是什么,都可以获取到)
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、获取属性信息
-
①Class<?> getDeclaringClass():返回声明Field对象表示字段的类或接口所对应的Class对象
-
②int getModifiers():以整数形式返回Field对象表示的字段的修饰符
-
③Class<?> getType():返回Field对象所表示字段的数据类型所对应的Class对象(推荐)
-
④Type getGenericType():返回此Field对象所表示字段的声明类型。
-
⑤String getName():返回Field对象表示字段的名称
3、操作属性
-
①void setAccessible(boolean flag):设置或获取属性值时是否忽略访问权限的影响,true表示忽略,false表示不忽略
-
②Object get(Object obj):返回Field表示字段的Object类型的值。obj为该属性所在类创建的对象,如果该属性是静态的,则可设置为null
-
③void set(Object obj, Object value):为Field对象表示属性设置新值。obj为该属性所在类创建的对象,如果该属性为静态的则课设置为null;value为该属性新值



普通方法
1、获取普通方法
-
①Method[] getMethods():返回一个该Class对象表示类或接口中所有public方法(含继承的)对应的Method对象数组
-
②Method getMethod(String methodName, Class<?>… parameterTypes):返回与该Class对象表示类或接口中方法名和方法形参类型相匹配的public方法(含继承的)的Method对象
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Method met=clazz.getMethod("doHomework",Integer.TYPE,String.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
-
③Method[] getDeclaredMethods():返回一个该Class对象表示类或接口内声明定义的所有访问权限的方法(不含继承的)对应的Method对象数组
-
④Method getDeclaredMethod(String methodName,Class<?>… parameterTypes) :返回与该Class对象表示类或接口中方法名和方法形参类型相匹配方法(不含继承的)对应的Method对象
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Method met=clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、获取普通方法信息
-
①Class<?> getDeclaringClass():返回声明Method对象表示方法的类或接口的 Class 对象
-
②int getModifiers():以整数形式返回此Method对象所表示方法的修饰符。应该使用Modifier类中的toString方法对所返回的整数进行解码
-
③Class<?> getReturnType():返回Method对象所表示的方法的返回值类型所对应的Class对象
-
④String getName():返回方法名
-
⑤Class<?>[] getParameterTypes():返回由Method对象代表方法的形参类型对应Class对象组成的数组。如果方法没有参数,则数组长度为 0
-
⑥Class<?>[] getExceptionTypes():返回由Method对象表示方法抛出异常类型对应Class对象组成的数组。如果此方法没有在其 throws子句中声明异常,则返回长度为 0 的数组
3、操作普通方法
-
①void setAccessible(boolean flag):调用方法时是否忽略访问权限的影响,true表示忽略,false表示不忽略
-
②Object invoke(Object obj, Object… args):调用Method对象指代的方法并返回Object类型结果。obj表示该方法所在类实例,如果方法时静态的则obj可以指定为null; args表示传入该方法的参数,如果方法没有参数,则args数组长度可以为 0 或 null
public class Test{
public static void main(String[] args) {
try{
Class clazz;
clazz=Student.class;
Method met=clazz.getDeclaredMethod("doHomework",Integer.TYPE,String.class);
met.setAccessible(true);//忽略访问权限的影响
Object obj=met.invoke(4,"qiang")
System.out.println(obj)
} catch (Exception e) {
e.printStackTrace();
}
}
}
//运行结果:
1*/
本文详细介绍了Java反射中如何获取与使用构造方法、属性和普通方法。包括获取构造方法、属性和普通方法的各种方式,获取相关信息如修饰符、类型等,并展示了如何通过反射创建对象、设置和获取属性值以及调用方法。

1552

被折叠的 条评论
为什么被折叠?



