1.反射的定义
反射就是把java类中的各种成分映射成相应的java类。例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的java类来表示。表示java类的Class类要提供一系列方法来获取其中的变量,方法,构造方法等。这些信息就是用相应类的实例对象来表示。
2.反射的基石Class类
Java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class
(1)如何获得各个字节码的实例对象?
a.类名.class 例如Person类 Person.class;
b.对象.getClass() 例如:new Person().getClass();
c.Class.forName(“类名”) 例如:Class.forName(“java.lang.String”);
(2).Class类的九个预定义实例对象
byte.class,char.class,short.class,int.class,float.class,double.class,boolean.class,long.class,void.class
3.构造方法的反射
(1)如何得到某个类的构造方法?
Constructor[] constructors = Class.forName(“类名”).getConstructors();
package com.blog;
import java.lang.reflect.Constructor;
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public static void main(String[] args) throws Exception{
Constructor[] constructors = Class.forName("com.blog.Student").getConstructors();
for(int i=0;i<constructors.length;i++){
System.out.println(constructors[i]);
}
}
}
输出结果:
public com.blog.Student(java.lang.String,int)
public com.blog.Student()
如果想得到某个构造方法,则要加入参数
例如:
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
package com.blog;
import java.lang.reflect.Constructor;
public class St {
public static void main(String[] args) throws Exception{
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
System.out.println(constructor);
}
}
输出结果:
public java.lang.String(java.lang.StringBuffer)
(2).创建实例对象
通常方式:String str= new String(new StringBuffer(“a”));
反射方式:
String str=(String)Constructor.newInstance(new StringBuffer(“a”));
调用获得方法时要用到上面相同类型的实例对象。
4.成员变量的反射:
通过Field类先获得类的字节码对象,然后通过Field类的get(对象)方法来获得对象的值;
例子:
package com.blog;
import java.lang.reflect.Field;
public class RefelectDemo {
public int age;
public String name;
public RefelectDemo(String name,int age){
this.name=name;
this.age=age;
}
public static void main(String[] args) throws Exception{
RefelectDemo re =new RefelectDemo("lao",25);
Field field = re.getClass().getField("name");
Field field2 = re.getClass().getField("age");
System.out.println(field.get(re));
System.out.println(field2.get(re));
}
}
输出结果:
lao
25
5.成员方法的反射
通过 Method类,Method类代表某个类的一个成员方法
得到某一个类的方法:
MethodcharAt= Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
通常方式:str.chatAt(1);
反射方式:charAt.invoke(str,1);
如果invoke传递的参数是null,说明该Method对象对象的是一个静态方法
package com.blog;
import java.lang.reflect.Method;
public class RefelectDemo {
public static void main(String[] args) throws Exception{
String str = new String("ads");
Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);
System.out.println(charAt);
System.out.println(str.charAt(1));
System.out.println(charAt.invoke(str, 2));
}
}