一:Class类的使用
java.lang.Class
获得Class的方法:1,实例.getClass
2,【类名】.Class
3,Class aclass=null;
aclass=Class.ForName("java.lang.String");
二:动态加载与静态加载
1,编译时刻加载的类为静态加载类; 运行时加载的类为动态加载类。
例如:动态加载Class c=Class.forName();
静态Student stu=new Student();
2,利用接口规范创建的实例,可以实现动态加载类,以及添加功能
例如:
接口
package Reflectt.service;
/**
* Created by zhouyongxing on 2016/11/21.
*/
public interface People {
void speak();
}
接口的实现类
package Reflectt;
import Reflectt.service.People;
/**
* Created by zhouyongxing on 2016/11/21.
*/
public class Student implements People{
String lecture="我是工大的学生";
public void speak(){
System.out.println(lecture);
}
}
Test 类
package Reflectt;
import Reflectt.service.People;
/**
* Created by zhouyongxing on 2016/11/21.
*/
public class Test {
public static void main(String [] args){
System.out.println("start");
try{
//在运行时动态加载类
Class Stu=Class.forName("Reflectt.Student"); //这里字符串可以为变量的,实现动态效果
People people=(People) Stu.newInstance();
people.speak();
}catch(ClassNotFoundException e) {
System.out.println("没找到Student类");
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
三:获取类中的信息
(主要食用getXXX方法,具体方法可以查看源代码活着官方文档)
四:反射的基本操作
1,获取方法:方法名和方法的参数的列表可以唯一确定一个方法
2,例如
package Reflectt.service;
import Reflectt.Student;
import java.lang.reflect.Method;
/**
* Created by zhouyongxing on 2016/11/21.
*/
public class ReflectDemo1 {
public static void main(String [] args) {
try {
Student student = new Student();
Class c =student.getClass();
Method method = c.getMethod("print", String.class,String.class); //通过方法名和参数列表获取方法
method.invoke(student,"afafad","jfkadjfk"); //调用实力对象的方法,并传入参数。如果有返回类型,则返回Object需要强制转换。如果方法的返回类型为void,则返回null
}catch (Exception e){
System.out.print("出错");
}