反射机制
1、反射机制有什么用?
通过 java 语言中的反射机制可以操作字节码文件。
有点类似于黑客。(可以读和修改字节码文件。)
通过反射机制可以操作代码片段。(class文件。)
2、反射机制的相关类在哪个包下?
java.lang.reflect.*;
3、反射机制相关的类有哪些?
java.lang.Class:代表字节码文件。代表这个字节码,代表一个类型。代表整个类。
java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法。
java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)。
java.lang.Class:
public class User{
// Field
int no;// Constructor
public User(){}
public User(int no){
this.no = no;
}// Method
public void setNo(int no){
this.no = no;
}
public int getNo(){
return no;
}
}
要操作一个类的字节码,需要首先获取到这个类的字节码,怎么获取 java.lang.Class 实例?
三种方式:
第一种:Class c = Class.forName(“完整类名带包名”); 例:“java.lang.String”,"java.util.Date"等
第二种:Class c = 对象.getClass();
第三种:Class c = 任何类型.class;
什么是在类路径下?凡是在 src 下的都是类路径下。src 是类的根路径。
回顾反射机制
1、什么是反射机制?反射机制有什么用?
反射机制:可以操作字节码文件。
作用:可以让程序更加灵活。(如:可以任意实例化对象,不修改代码)
2、反射机制相关的类在哪个包下?
java.lang.reflect*;
3、反射机制相关的主要的类?
java.lang.Class
java.lang.reflect.Method;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
4、在 java 中获取 Class 的三种方式?
第一种:Class c = Class.ForName(“完整类名”); 例:“java.lang.String”,"java.util.Date"等
第二种:Class c = 对象.getClass();
第三种:Class c = 任何类型.class;
例:
Class c = int.class;
Class c = String.class;
Class c = Class.ForName(“java.lang.String”);
5、获取了 Class 之后,可以调用无参数构造方法来实例化对象
Class c = Class.forName(“java.util.Date”); // c 代表日期 Date 类型,也可以是其它类型,包括自己建的类
Object obj = c.newInstance(); // 实例化一个 Date 日期类型的对象
一定要注意:newInstance() 底层调用的是该类型的无参数构造方法。如果没有这个无参数构造方法会出现“实例化”异常。
6、如果你只想让“静态代码块”执行的话,你可以怎么做?
Class.forName(“该类的类名”);
这样类就加载,类加载的时候,静态代码块执行!!!
在这里,对该方法的返回值不感兴趣,主要是为了使用“类加载”这个动作。
7、关于路径问题?
String path = Thread.currentThread().getContextClassLoader()
.getResource(“写相对路径,但是这个相对路径从 src 出发开始找”).getPath();
例:
// 必须保证src下有abc文件。
String path = Thread.currentThread().getContextClassLoader().getResource(“abc”).getPath();
// 必须保证src下有a目录,a目录下有ab文件。
String path = Thread.currentThread().getContextClassLoader().getResource(“a/ab”).getPath();
这种方式是为了获取一个文件的绝对路径。(通用方式,不会受到环境移植的影响。)
但是该文件要求放在类路径下,换句话说:也就是放到 src 下面。src 下是类的根路径。直接以流的形式返回:
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/bjpowernode/test.properties");
8、IO + Properties,怎么快速绑定属性资源文件?
// 要求:第一个这个文件必须在类路径下。第二个这个文件必须是以 .properties 结尾。
// 路径后面的扩展名不能写
ResourceBundle rb = ResourceBundle.getBundle(com/bjpowernode/test);
String value = rb.getString(key);
严格意义上,src 并不是类路径
能用记事本编辑的都是文本文件。普通文本文件和后缀无关。
java 中怎么区分一个方法?依靠方法名和参数列表。
方法调用要素分析:
要素1:实例对象
要素2:方法名
要素3:实际参数列表
要素4:方法返回值类型