*1、反射机制有什么用?(关系到后面的框架)*
通过java语言中的反射机制可以操作字节码文件,或者访问字节码文件。
优点类似于黑客(可以读和修改字节码文件)
通过反射机制可以操作代码片段(class文件)
作用:可以让程序更加灵活。
*2、反射机制的相关类在哪个包下?*
java . lang . reflect .*
*3、反射机制相关的重要类有哪些?*
(重要)java.lang.Class 代表整个字节码,一个类型。代表整个类。
(重要)java.lang.reflect.Method 代表字节码中的方法字节码。代表类中的方法。
(重要)java.lang.reflect.Filed 代表字节码中的属性字节码。代表类中的方法。
java.lang.reflect.Constructor 代表字节码中的构造方法字节码。代表类中的构造方法。
例如: class Number{ //Class
private int i=0; //Filed
public Number(int i) { //Constructor
super();
this.i = i;
}
public Number() {
super();
}
public int getI() { //Method
return i;
}
public void setI(int i) {
this.i = i;
}
}
*4、要操作一个类的字节码,首先要获取这个 类 的字节码,怎么获取? java.lang.Calss*
*三种方式:*
***\*(1)第一种:Calss c1=Class.forName("完整类名带包名");\****
Object obj=c1.newInstance(); //newInstance()方法底层调用了类c1的无参数构造方法,所以c1必须有无参构造。
forName()为静态方法;
方法的参数是一个字符串;字符串需要的是一个完整类名;
完整类名必须带包名,例如:java.lang.String
使用forName()时,传入的类会进行类加载
*(2)第二种:Class c2=对象引用.getClass();*
实例方法;
任何对象都有的方法;
***\*(3)第三种:Class c3=任何类型(包括基本数据类型).Class;\****
java中任何一种类型并且包括 基本数据类型,都有的.class属性。
*5、如何获取一个类文件的绝对路径?(死记)*
下面的这种方式是通用,默认在src下查找,前提是该文件必须在类路径(src)下:
*(1)方法一:先获取文件的绝对路径*
String path=Thread.currentThread.getContextClassLoader().getResource("文件相对src下的位置").getPath();
*(2)方法二:先获取文件的流(建议使用,不需要new io流了)*
InputStream inputStream=Thread.currentThread().getContextClassLoader().getResourceAsStream("文件相对src下位置");
*(3)方法三:获取资源绑定器(如果读取properties文件,建议使用)*
ResourceBundle bundle=ResourceBundle.getBundle("properties文件文件名");
String s=bundle.getString("key值");
注意:上面的"properties文件名",不能有文件类型后缀。例如,db.properties文件,传进去时写成:“db”。
*6、如果只想让一个类的静态代码块执行:*
Class.forName(“类路径”);
因为forName()方法会进行类加载。
*7、可变参数:*
类型…args 例:int…args String…args1 double…args2
注意:(一定是三个点, …)
1.可变长度参数要求的参数个数是:0~N个
2.可变长度参数在方法参数列表中必须在最后一个位置,并且方法参数列表中只有一个
3.可变参数长度可以当做一个数组来看待,也有length属性
*8、通过反射机制访问和修改属性值*
例:
(1)获取Class字节码文件
Class c1=Class.forName(“类路径”);
(2)获取类对象obj
Object obj=c1.newInstance();
(3)通过属性名获取属性
Field no= c1.getDeclaredField(“no”); //getDeclaredFiled(“属性名”)
(4)设置属性值
如果是私有属性:
no.setAccessible(true); //打破私有封装
no.set(obj, 141);
如果不是私有属性:
no.set(obj, 141);
(5)获取属性值
no.get(obj);
*9、通过反射机制调用方法:*
例:
(1)获取Class字节码文件
Class c1=Class.forName(“类路径”);
(2)获取类对象ljs
Object ljs=c1.newInstance();
(3)通过反射机制获取文件中的方法:getDeclaredMethod(“方法名”,参数类型.class)
Method login=c1.getDeclaredMethod("login", int.class,String.class);
(4)通过反射机制调用方法:invoke(对象名,参数值)
Object value=login.invoke(ljs, 141,"ljs");
*10、通过反射机制调用构造方法:*
*调用无参构造*
例: (1)获取Class字节码文件
Class c1=Class.forName(“类路径”);
(2)获取类对象ljs,调用无参构造
Object ljs=c1.newInstance();
*调用有参构造*
例: (1)获取Class字节码文件
Class c1=Class.forName(“类路径”);
Constructor c= c1.getDeclareConstructor(int.calss, String.class);
Object obj=c.newInstance(141,"ljs");