本文主要从以下几个方面对java反射机制进行总结:
1. 反射的概念
2.反射的作用
3.反射主要类说明
4.反射实例
反射的概念
java反射机制是在运行状态中,能够知道任意类下的所有方法和属性,能够调用任意对象的方法和属性。这种能动态获取方法和属性并调用的机制称反射机制。
反射的作用
在日常开发中,有时需要获取并调用第三方平台的某个方法或属性。而这些方法和属性往往只对系统应用或某些类开放,这时需要使用反射技术来解决。当然不是所有对象都能反射成功,比如被反射对象做了访问权限校验。
反射主要类
Class类
getDeclaredMethods() 获取类的所有公有和私有方法
getMethod(String name, 类<?>... parameterTypes) 根据给定参数类型去匹配获取类的某个公有方法
getMethods() 获取类的所有公有方法
getEnclosingMethod() 获取定义该类的公有方法
getDeclaredMethod(Stringname, 类<?>... parameterTypes)根据给定参数类型去匹配获取类的某个公有或私有方法
getConstructor(类<?>... parameterTypes) 根据给定参数类型去匹配获取类的某个公有构造方法
getConstructors() 获取类的所有公有构造方法
getDeclaredConstructor(类<?>... parameterTypes) 根据给定参数类型去匹配获取类的某个公有或私有构造方法
getDeclaredConstructors() 根据获取类的全部公有或私有构造方法
getEnclosingConstructor() 获取定义该类的公有构造方法
getDeclaredField(String name) 获取指定名称的公有或私有属性;
getDeclaredFields() 获取所有属性
getField(String name) 获取指定名称的公有属性
getFields() 获取所有公有属性
Constructor类
newInstance(Object... initargs) 根究指定的参数找到对应的构造函数并实例出对象
Field类
getName() 返回由此 Field对象表示的字段的名称
set(Object obj, Object value) 将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
get(Object obj) obj表示某个对象,返回指定对象的此Field的值
Method类
invoke(Object obj, Object... args) 。obj表示被调用方法的某个对象,args表示调用此方法需要的参数。调用某个对象的Method对象所表示的方法。
反射实例
被反射的类
public class Book{
private final static StringTAG ="BookTag";
private Stringname;
private Stringauthor;
public Objectb;
@Override
public String toString() {
return "Book{" +"name='" +name +'\'' +", author='" +author +'\'' +'}';
}
public Book(){ }
public Book(String name, String author) {
this.name = name;
this.author = author;
class a{
String c;
String d;
public a(){}
public a(String a, String b){
c = a;
d = b;
}
@Override
public StringtoString() {
return c +"----" +d;
}
}
b =new a();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public StringgetAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
private String declaredMethod(String index) {
String string =null;
switch (index) {
case "0":
string ="I am declaredMethod 1 !";
break;
case "1":
string ="I am declaredMethod 2 !";
break;
default:
string ="I am declaredMethod 1 !";
}
return string;
}
}
反射类
public class ReflexClass {
private final static StringTAG ="peter.log.ReflectClass";
// 创建对象
public static void reflectNewInstance() {
try {
Class classBook = Class.forName("com.reflex.Book");//初始化类对象
Object objectBook = classBook.newInstance();//创建一个实例
Book book = (Book) objectBook;
book.setName("Android进阶之光");
book.setAuthor("刘望舒");
System.out.println(book.toString());
}catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] a){
ReflexClass.reflectEnclosingConstructor();
// ReflexClass.reflectPrivateField();
}
// 反射私有的构造方法
public static void reflectPrivateConstructor() {
try {
Class classBook = Class.forName("com.reflex.Book");
//获取一个参数个数为2,参数类型均为String类型的构造函数
Constructor declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);
declaredConstructorBook.setAccessible(true);//TRUE表示禁止java语言访问器检查访问
//使用构造函数对象生成实例
Object objectBook = declaredConstructorBook.newInstance("Android进阶之光","test");
Book book = (Book) objectBook;
System.out.println(book.toString());
}catch (Exception ex) {
ex.printStackTrace();
}
}
// 反射定义内部类的构造方法
public static void reflectEnclosingConstructor() {
try {
Class classBook = Class.forName("com.reflex.Book");
Class cls = ((Book)classBook.getDeclaredConstructor(String.class,String.class)
.newInstance("Android进阶之光","test")).b.getClass();
//获取一个参数个数为2,参数类型均为String类型的构造函数
Constructor declaredConstructorBook = cls.getEnclosingConstructor();
declaredConstructorBook.setAccessible(true);//TRUE表示禁止java语言访问器检查访问
//使用构造函数对象生成实例
Object objectBook = declaredConstructorBook.newInstance("Android进阶之光","test1");
Book book = (Book) objectBook;
System.out.println(book.toString());
}catch (Exception ex) {
ex.printStackTrace();
}
}
// 反射私有属性
public static void reflectPrivateField() {
try {
Class classBook = Class.forName("com.reflex.Book");
Object objectBook = classBook.newInstance();
Field fieldTag = classBook.getDeclaredField("TAG");//获取指定名称的属性
fieldTag.setAccessible(true);
String tag = (String) fieldTag.get(objectBook);//获取一个指定实例的属性
System.out.println(fieldTag.getModifiers());
}catch (Exception ex) {
ex.printStackTrace();
}
}
// 反射私有方法
public static void reflectPrivateMethod() {
try {
Class classBook = Class.forName("com.reflex.Book");
//根据方法名和方法参数的类名生成方法对象
Method methodBook = classBook.getDeclaredMethod("declaredMethod",String.class);
methodBook.setAccessible(true);
Object objectBook = classBook.newInstance();//生成一个对象
String string = (String) methodBook.invoke(objectBook,"0");//根据实例和参数调用方法获取返回值
System.out.println(string);
}catch (Exception ex) {
ex.printStackTrace();
}
}
}
网友评论