反射
反射机制:反射就是通过获取该类的字节码文件对象。
获取方式:
1>Object类中的getClass()方法,表示正在运行的那个类:Class类。
2>数据类型的Class属性
3>Class类中的特有方法:forName(String className):(重点)
public static Class<?> forName(String className):获取字节码文件对象。字符串的内容是一个类的全路径名称。
获取所有公共构造方法:
public Constructor<?>[] getConstructors():返回的是一个构造方法所在数组。
获取所有构造方法:
public Constructor<?>[] getDeclaredConstructor():获取的是当前字节码文件对象中所有的构造方法.
获取单个构造方法:
public Constructor<T> getConstructor(Class<?>...parameterTypes):返回的是一个Constructor对象,反映Class对象所表示的类的指定公共构造方法。
public T newInstance(Object... initargs):传递的是实际参数,表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例.
相关代码:
public class Person {
private String name;
int age;
public String address;
public Person(){}
private Person(String name){
this.name=name;
}
Person(String name,int age){
this.name=name;
this.age=age;
}
public Person(String name,int age,String address){
this.name=name;
this.age=age;
this.address=address;
}
public void show(){
System.out.println("show");
}
public void method(String s){
System.out.println("method"+s);
}
public String getString(String s,int i){
return s+"---"+i;
}
private void function(){
System.out.println("function");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", address="
+ address + "]";
}
}
//获取构造方法
import java.lang.reflect.Constructor;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class c = Class.forName("westos_01.Person");
Constructor[] con=c.getConstructors();
for(Constructor constructor:con){
System.out.println(constructor);
}
System.out.println("----------------");
Constructor[] con1=c.getDeclaredConstructors();
for(Constructor constructor1:con1){
System.out.println(constructor1);
}
System.out.println("----------------");
Constructor con2=c.getConstructor();
Object newInstance = con2.newInstance();
System.out.println(newInstance);
System.out.println("----------------");
Constructor con3=c.getConstructor(String.class,int.class,String.class);
Object newInstance2 = con3.newInstance("立华奏",20,"音无");
System.out.println(newInstance2);
}
}
获取成员变量:
获取所有公共成员变量:
public Field[] getField():返回的Field对象数组。
获取单个公共成员变量:
public Field getField(String name):获取公共的指定的字段。参数为当前成员变量名称
将指定对象变量上此 Field 对象表示的字段设置为指定的新值public void set(Object obj, Object value).
public Field getDeclaredField(String name):获取类或接口中已经声明的指定的字段.
public void setAccessible(boolean flag):在访问的时候取消java语言访问检查(强制性).值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查.
相关代码:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class Reflect2Demo {
public static void main(String[] args) throws Exception {
Class c=Class.forName("westos_01.Person");
Field[] fields = c.getFields();
for(Field f:fields){
System.out.println(f);
}
System.out.println("-------------------");
Constructor con=c.getConstructor();
Object object = con.newInstance();
Field field = c.getField("address");
field.set(object, "立华奏");
System.out.println(object);
System.out.println("-------------------");
Field declaredField = c.getDeclaredField("name");
declaredField.setAccessible(true);
declaredField.set(object, "音无");
System.out.println(object);
System.out.println("-------------------");
Field declaredField2 = c.getDeclaredField("age");
declaredField2.setAccessible(true);
declaredField2.set(object, 20);
System.out.println(object);
}
}
获取成员方法:
获取所有公共成员方法:
public Method[] getMethods():获取当前该字节码文件对象(Person.class)中自己本身以及它父类中所有的公共成员方法.
public Method[] getDeclaredMethods():获取当前字节码文件对象本身所有的成员方法
获取单个公共成员方法:
public Method getMethod(String name,Class<?>... parameterTypes):指定公共成员方法。参数1:表示方法名;参数2:该方法的参数类型的Class对象:String.class
public Object invoke(Object obj, Object... args)参数1:表示当前针对哪个以实例对象进行方法的调用,参数2:当前调用该方法的时候里面传递的实际参数。
public Method getDeclaredMethod(String name,Class<?>... parameterTyape'nrs):获取的是已经指定的声明方法。
相关代码:
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Reflect3Demo {
public static void main(String[] args) throws Exception {
Class c=Class.forName("westos_01.Person");
Method[] m=c.getMethods();
for(Method mt:m){
System.out.println(mt);
}
Constructor con=c.getConstructor();
Object object = con.newInstance();
Method m1=c.getMethod("show");
m1.invoke(object);
System.out.println("-----------------------");
Method m2=c.getMethod("method", String.class);
m2.invoke(object, "method");
System.out.println("-----------------------");
Method m3=c.getMethod("getString", String.class,int.class);
String getString=(String) m3.invoke(object, "立华奏",20);
System.out.println(getString);
System.out.println("-----------------------");
Method m4=c.getDeclaredMethod("function");
m4.setAccessible(true);
m4.invoke(object);
}
}