反射功能强大,但是项目中不要滥用,以免污染其他代码。
java的反射机制原理
一 反射机制的概念:
指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制.
二 反射机制的应用:
生成动态代理,面向切片编程(在调用方法的前后各加栈帧).
三 反射机制的原理:
1 首先明确的概念: 一切皆对象----类也是对象.
2 然后知道类中的内容 :modifier constructor field method.
3 其次明白加载: 当Animal.class在硬盘中时,是一个文件,当载入到内存中,可以认为是一个对象,是java.lang.class的对象.
package com.bjsxt.reflect;
//接口
public interface MyInterface {
void interfaceMethod();
}
}
package com.bjsxt.reflect;
public class Person implements MyInterface {
private int id;
private String name;
private int age;
public Person() {
}
public Person(int id) {
super();
this.id = id;
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
private void privateMethod() {
System.out.println("private method ...");
}
public void setAge(int age) {
this.age = age;
}
public static void staticMethod() {
System.out.println("static s method..........");
}
@Override
public void interfaceMethod() {
System.out.println("interface Method..........");
}
package com.bjsxt.reflect;
//通过反射机制获取类
public class ReflectDemo01 {
public static void main(String[] args){
//获取反射对象(反射入口):Class
//1. Class.forName() 2.xx.class 3. 对象.getclass
//1. Class.forName("包名+类名(必须写全)") --》 获取类
try {
Class<?> perClazz = Class.forName("com.bjsxt.reflect.Person");
System.out.println(perClazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//2. 类名.class
Class<?> perClazz2 = Person.class;
System.out.println(perClazz2);
//3. 对象.getClass()
Person per = new Person();
Class<?> perClazz3 = per.getClass();
System.out.println(perClazz3);
}
}
package com.bjsxt.reflect;
import java.lang.reflect.Method;
//通过反射机制获取方法
public class ReflectDemo2 {
//获取方法
public static void demo02() {
//Class入口
Class<?> perClazz = null;
try {
perClazz = Class.forName("com.bjsxt.reflect.Person");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取所有的 公共的方法
//1.本类以及父类、接口中的所有方法 2.符合访问修饰符规律
Method[] methods = perClazz.getMethods();
for(Method method:methods) {
System.out.println(method);
}
}
public static void main(String[] args){
demo02();
}
}