一、构造方法 ( Constructor)
1、 获取含有public修饰的构造方法 getConstructor()、getConstructors()
package reflect;
public class Student {
public void doHomework() {
System.out.println(name+"正在写作业~~~");
}
String name;
public Student() {
}
public Student(String name) {
this.name =name;
}
}
一、单个获取:
getConstructor(Class ... para ):该方法可以获取到Class类中的单个public 修饰符修饰的 构造方法:
package reflect;
import java.lang.reflect.Constructor;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Constructor constructor =clazz.getConstructor(String.class);
System.out.println(constructor);
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、多个获取
getConstructors():返回一个Constructor类型的数组
package reflect;
import java.lang.reflect.Constructor;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Constructor [] constructor =clazz.getConstructors();
for (Constructor letters : constructor) {
System.out.println(letters);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
可以看到:返回的数组可以使用加强遍历的方法进行逐个查询
2、可以获取全部的构造方法 getDeclaredConstructor(Class ... para)、getDeclaredConstructors()
package reflect;
public class Student {
public void doHomework() {
System.out.println(name+"正在写作业~~~");
}
String name;
public Student(int age) {
System.out.println(age)
}
private Student(String name) {
this.name =name;
}
}
一、单个导出:
getDeclaredConstructor(Class ... para):
package reflect;
import java.lang.reflect.Constructor;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Constructor constructor =clazz.getDeclaredConstructor(String.class);
System.out.println(constructor);
} catch (Exception e) {
e.printStackTrace();
}
}
}
此时的构造放方法被private修饰:结果就是
二、多个导出(加强循环)
package reflect;
import java.lang.reflect.Constructor;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
Constructor [] constructors=clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
}
}
}
三、获取的构造方法作用
package reflect;
public class Student {
public void doHomework() {
System.out.println(name+"正在写作业~~~");
}
String name;
public Student(int age) {
System.out.println(age)
}
private Student(String name) {
this.name =name;
}
}
1、获取相应的参数:
一、获取权限修饰 getModifiers()方法 :返回一个整型 Modifier.toString(int )可将整型返回一个字符修饰符对应的字符串
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
Constructor [] constructors=clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
int j=constructor.getModifiers();
System.out.println(Modifier.toString(j));
}
}
}
二、获取类名: getDeclaringClass(): 获取构造犯法对应的类的位置
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
Constructor [] constructors=clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor.getDeclaringClass());
}
}
}
三、获取参数列表 :getParameterTypes()方法返回一个class类的数组,输出对应参数列表中的class类
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
Constructor [] constructors=clazz.getConstructors();
for (Constructor constructor : constructors) {
Class [] zz=constructor.getParameterTypes();
for (Class class1 : zz) {
System.out.println(class1);
}
}
}
}
四、使用反射创建对象: newInstance(class . . . Param):输入再创建对象时所需要的形参
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Constructor constructor=clazz.getConstructor(String.class);
Student stu=(Student)constructor.newInstance("Tom");
System.out.println(stu.name);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package reflect;
public class Student {
private Student() {
}
}
setAccessible(boolean flag):可以忽略构造方法前面的private修饰:
package reflect;
import java.lang.reflect.Constructor;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Constructor constructor= clazz.getDeclaredConstructor();
constructor.setAccessible(true);
constructor.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、方法 (Method)
package reflect;
public class Student {
public static void doHomework(String name) {
System.out.println(name+"正在写作业~~~");
}
private static void move(String age) {
System.out.println(age+"正在移动");
}
}
背景 :由于方法的反射与构造方法的反射极其类似:一下简写重复内容
1、获取方法:
getMethods():
获取父类和子类中的全部:public 修饰的方法
package reflect;
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
Method [] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
}
}
结果如下图:其中大部分除doHomework 其他的都是父类中继承的方法
getDeclaredMethods(): 找到本类中的全部方法
package reflect;
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
Method [] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
}
}
getDeclaredMethod(String name,Class ... Param):输入方法的名字和参数列表,即可获得class类中的方法
package reflect;
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Method method =clazz.getDeclaredMethod("move", String.class);
System.out.println(method.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
这里可以反射非public 方法
getMethod(String name,Class ... Param):查找父类本类中的public方法
2、基本方法:
一、获取修饰符 :getModifier() Modifier.toString()
二、获得类名: getDeclaringClass()
三、获得参数列表:Class<?>[] getParameterTypes()
四、获得返回值:method.getReturnType()
package reflect;
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Method method =clazz.getDeclaredMethod("move", String.class);
Class zz=method.getReturnType();
System.out.println(zz.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行代码:返回 void
3、通过反射调用方法: invoke(Object obj, Object... args): 前面实例对象 后面参数列表调用
package reflect;
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Method method =clazz.getDeclaredMethod("move", String.class);
method.setAccessible(true);
method.invoke(new Student(), "Tom");
} catch (Exception e) {
e.printStackTrace();
}
}
}
此处使用的move被private修饰。 所以必须使用setAccessible(boolea flag)把权限屏蔽掉
三、成员变量 ( Field)
package reflect;
public class Student {
private String name;
public String id;
}
1、获取成员变量
一、getField(String name)
二、getFields()
前两个均是可以得到继承类和本类的成员变量:
package reflect;
public class Father {
public String has;
}
使Student继承该Father类执行下面代码:
package reflect;
import java.lang.reflect.Field;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Field[] field =clazz.getFields();
for (Field field2 : field) {
System.out.println(field2.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、getDeclaredField(String name);
四、getDeclaredFields();
均是获得本类中的全部方法:
package reflect;
import java.lang.reflect.Field;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Field[] field =clazz.getDeclaredFields();
for (Field field2 : field) {
System.out.println(field2.getName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、基本方法
一、获取修饰符 :getModifier() Modifier.toString()
二、获得类名: getDeclaringClass()
三、获得本身的class类型:getTYPE() [返回值不再是数组]
package reflect;
import java.lang.reflect.Field;
public class Test{
public static void main(String[] args) {
Class clazz;
clazz=Student.class;
try {
Field[] field =clazz.getDeclaredFields();
for (Field field2 : field) {
System.out.println(field2.getType());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、使用成员变量
一、void setAccessible(boolean flag)
二、get(Object obj)//获得获得的Field本身被赋予的值 返回一个Object类 括号中是实例化对象
三、set(Object obj, Object value)//为Field赋予值 前面一个是实例化对象 后面的是具体的值
package reflect;
import java.lang.reflect.Field;
public class Test{
public static void main(String[] args) {
Student stu =new Student();
Class clazz;
clazz=Student.class;
try {
Field field =clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(stu, "Tom");
System.out.println(field.get(stu));
} catch (Exception e) {
e.printStackTrace();
}
}
}