一,Class类:包装java程序中各个java类的一个类。它描述了一个类的名称,类的访问属性,字段名称列表,方法名称列表等等。
二,获取一个类Class类实例(字节码文件):
Person p = new Person();
1. Person.class
2. P.getClass();
3. Class.forName(“Person类的完整路径”);-------à常用方法
三,反射的概念:
反射就是把java类中的各种成分映射成相应的java类
四,九个预定义Class对象实例:
有九种预定义的 Class
对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 boolean
、byte
、char
、short
、int
、long
、float
和 double
。
五,反射获取类的构造方法及应用(Constructor<T>的常用方法):
1.获取类的构造方法:
getConstructors()
返回一个包含某些Constructor
对象的数组,这些对象反映此Class
对象所表示的类的所有公共构造方法。
getConstructor(Class<?>... parameterTypes)
返回指定参数的一个 Constructor
对象
getDeclaredConstructor(Class<?>... parameterTypes)
返回一个 Constructor
对象,该对象反映此 Class
对象所表示的类或接口的指定构造方法。
getDeclaredConstructors()
返回 Constructor
对象的一个数组,这些对象反映此 Class
对象表示的类声明的所有构造方法。
注意:getConstructors()获得某个类的所有的公共(public)的构造函数,包括父类。
getDeclaredConstructors()获得某个类的所有申明的构造函数,即包括public、private和proteced,以下同理
2.应用(Constructor<T>的常用方法):
newInstance(Object... initargs) (主要使用方法)
使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并 用指定的初始化参数初始化该实例。
getAnnotation(Class<T> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
getDeclaredAnnotations()
返回直接存在于此元素上的所有注释。
getModifiers()
以整数形式返回此Constructor
对象所表示构造方法的 Java 语言修饰符。
getName()
以字符串形式返回此构造方法的名称。
六,反射获取类的成员变量及应用:
1.获取类的构造方法:
getField(String name)
返回一个Field
对象,它反映此Class
对象所表示的类或接口的指定公共成员字段。
getFields()
返回一个包含某些Field
对象的数组,这些对象反映此Class
对象所表示的类或接口的所有可访问(私有的不可访问)公共字段。
getDeclaredField(String name)
返回一个Field
对象,该对象反映此Class
对象所表示的类或接口的指定已声明字段。
getDeclaredFields()
返回Field
对象的一个数组,这些对象反映此Class
对象所表示的类或接口所声明的所有字段。
2.应用(Field的常用方法):
get(Object obj)
返回指定对象上此Field
表示的字段的值。
getAnnotation(Class<T> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
getName()
返回此Field
对象表示的字段的名称。
getType()
返回一个Class
对象,它标识了此Field
对象所表示字段的声明类型。
set(Object obj, Object value)
将指定对象变量上此Field
对象表示的字段设置为指定的新值
示例代码:
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Test6 {
public static void main(String[] args) {
try {
Demo d = new Demo();
Field[] fields = d.getClass().getDeclaredFields();
for(Field f : fields){
if(f.getType() == String.class){
String str = (String) f.get(d);
//对一个私有属性的成员变量打印会报错
if(f.getModifiers() == Modifier.PUBLIC){
System.out.println(str);
}
String newStr = str.replace("i", "s");
f.set(d, newStr);
System.out.println(d.getStr());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Demo{
public String str = "xiaosu";
public String str1 = "houhuiyao";
public String getStr() {
return str;
}
}
七,反射获取类的成员方法及应用:
1. 获取类的成员方法:
getMethod(String name, Class<?>... parameterTypes)
返回一个Method
对象,它反映此Class
对象所表示的类或接口的指定公共成员方法。
getMethods()
返回一个包含某些Method
对象的数组,这些对象反映此Class
对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法。
getDeclaredMethods()
返回 Method
对象的一个数组,这些对象反映此 Class
对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
getDeclaredMethod(String name, Class<?>... parameterTypes)
返回一个Method
对象,该对象反映此Class
对象所表示的类或接口的指定已声明方法。
2. 应用(Method的常用方法):
invoke(Object obj, Object... args) (主要使用方法)(如果函数调用不需要参数,则参数不许写)
对带有指定参数的指定对象调用由此Method
对象表示的底层方法
getName()
以 String
形式返回此 Method
对象表示的方法名称
getAnnotation(Class<T> annotationClass)
如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
示例代码:
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class Test7 {
public static void main(String[] args) {
Demo0 d0 = new Demo0();
try {
Method[] methods = d0.getClass().getDeclaredMethods();
for(Method m : methods){
if(m.getModifiers() == Modifier.PUBLIC){
Class<?>[] types = m.getParameterTypes();
if(types.length<1){
//如果函数调用不需要参数,则参数不许写
m.invoke(d0);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Demo0{
public void show(){
System.out.println("hello");
}
}
八,对接收数组参数的成员方法进行反射并调用:
示例代码:
import java.lang.reflect.Method;
public class Test5 {
/**
* 数组传递,利用反射调用一个类的main方法
* @param args
*/
public static void main(String[] args) {
try {
Method main = Demo1.class.getMethod("main", String[].class);
//将数组强转成Object进行传递
main.invoke(null,(Object) new String[]{"0","1","2"});
//在数组外再包裹一层数组进行传递
main.invoke(null,new Object[]{new String[]{"0","1","2"}});
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Demo1{
public static void main(String[] args) {
for(String str : args){
System.out.println(str);
}
}
}
九,数组的反射:
1.获取数组的类型
getComponentType()
返回表示数组组件类型的 Class
。
2.通过Array操作数组:
set(Object array, int index, Object value)
将指定数组对象中索引组件的值设置为指定的新值。
get(Object array, int index)
返回指定数组对象中索引组件的值。
创建一个具有指定的组件类型和长度的新数组。