类加载器: ClassLoader
用来加载一个类的对象
Bootstrap ClassLoader: 启动类加载器, Platform的父类加载器
Platform ClassLoader: 平台类加载器, System的父类加载器
System ClassLoader: 系统类加载器
方法 | 返回值 | 说明 |
---|---|---|
ClassLoader.getSystemClassLoader() | 构造方法 | 获取系统类加载器 |
getParent() | ClassLoader | 获取父类加载器 |
getResource(String str) | URL | 根据 str路径 加载一个类 |
getResourceAsStream(String str) | InputStream | 根据 str路径 加载一个类 获取其字节流 |
import java.net.URL;
public class Demo {
public static void main(String[] args) throws Exception {
URL url = ClassLoader.getSystemClassLoader().getResource(""); //项目根路径的 URL
System.out.println(url);
System.out.println(url.getFile()); //根据 URL 获取文件路径
}
}
运行结果:
file:/F:/java/text/target/classes/
/F:/java/text/target/classes/
Class
Class: 类的字节码文件
Class对象: 类的对象,可以直接对类进行操作
方法 | 返回值 | 说明 |
---|---|---|
Class.forName(String str) | 构造方法 | 根据 str全类名 获取对象 |
类名.class | 构造方法 | 获取一个类的Class对象 |
对象.getClass() | 构造方法 | 获取对象的Class对象 |
getClassLoader() | ClassLoader | 获取class类的类加载器 |
getResource(String str) | URL | 根据 str路径(相对于该文件) 加载一个类 |
getResourceAsStream(String str) | InputStream | 根据 str路径(相对于该文件) 加载一个类 |
getConstructors() | Constructor[] | 返回所有公共的构造方法对象的数组 |
getDeclaredConstructors() | Constructor[] | 返回所有构造方法对象的数组 |
getConstructor(Class c) | Constructor | 返回具有形参 c 的公共的构造方法对象 |
getDeclaredConstructor(Class c) | Constructor | 返回具有形参 c 的构造方法对象 |
getFields() | Field[] | 返回所有公共的成员变量对象的数组 |
getDeclaredFields() | Field[] | 返回所有成员变量对象的数组 |
getField(String str) | Field | 返回此公共的成员变量 |
getDeclaredField(String str) | Field | 返回此成员变量 |
getMethods() | Method[] | 返回所有公共的成员方法对象的数组 |
getDeclaredMethods() | Method[] | 返回所有成员方法对象的数组 |
getMethod(String, Class c) | Method | 返回具有形参 c 的公共的成员方法对象 |
getDeclaredMethod(String, Class c) | Method | 返回具有形参 c 的成员方法对象 |
Constructor, Field, Method: setAccessible(true): 若想要修改被private修饰的对象,则需要临时取消访问检查
package cn.yang.text;
public class Test {
public int a;
private int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
@Override
public String toString() {
return "Test{" +
"a=" + a +
", b=" + b +
'}';
}
}
package cn.yang.text;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
public class Demo {
public static void main(String[] args) throws Exception {
URL url1 = Test.class.getClassLoader().getResource("");
URL url2 = Test.class.getResource("");
URL url3 = Test.class.getResource("/");
System.out.println(url1); //根路径
System.out.println(url2); //类的路径
System.out.println(url3); //根路径
Constructor<Test> constructor = Test.class.getConstructor();
Test test = constructor.newInstance();
test.setA(12);
test.setB(21);
System.out.println(test);
Field a = Test.class.getField("a");
Field b = Test.class.getDeclaredField("b");
a.set(test, 34); //将 对象test 中的 变量a 的值改为34
b.setAccessible(true); //由于 变量b 被 private 修饰,想要修改则需要临时取消访问检查
b.set(test, 43);
System.out.println(test);
Method getA = Test.class.getMethod("getA");
Method getB = Test.class.getMethod("getB");
System.out.println(getA.invoke(test)); //执行 对象test 的 getA方法
System.out.println(getB.invoke(test)); //执行 对象test 的 getB方法
}
}
运行结果:
file:/F:/java/text/target/classes/
file:/F:/java/text/target/classes/cn/yang/text/
file:/F:/java/text/target/classes/
Test{a=12, b=21}
Test{a=34, b=43}
34
43
URL
统一资源调配器
可以理解为一个连接,指向某个元素
方法 | 说明 |
---|---|
getContent() | 获取对象内容 |
getFile() | 获取对象路径和文件名 |
Constructor
Class类中的构造方法对象
方法 | 说明 |
---|---|
newInstance(参数) | 创建对象(直接用Class对象调用也可以) |
Field
Class类中的成员变量对象
方法 | 说明 |
---|---|
set(赋值给哪个对象, 赋的值) | 给对象的成员变量赋值 |
get(从哪个对象获取) | 获取对象的Field的值 |
Method
Class类中的成员方法对象
方法 | 说明 |
---|---|
invoke(调用方法的对象, 参数) | 运行该方法 可以有返回值 |
isAnnotationPresent(注解.class) | 判断该方法是否被该注解标注 |