大家好,欢迎来到IT知识分享网。
1.类加载
public class ClassLoadTest {
public static void main(String[] args) {
ClassLoader c1 = ClassLoader.getSystemClassLoader(); System.out.println(c1); ClassLoader c2 = c1.getParent(); System.out.println(c2); System.out.println(c2.getParent()); //Bootstrap一般值为null } }
2.反射
2.1反射概念
2.2获取Class类对象
public class ClassTest {
public static void main(String[] args) throws ClassNotFoundException {
//通过class属性获取类文件 Class<Student> c1 = Student.class; System.out.println(c1); System.out.println("---------"); //通过对象的getClass()获得 Student stu = new Student(); Class<? extends Student> c2 = stu.getClass(); System.out.println(c1==c2); System.out.println("---------"); //调用Class类的静态方法forName(),给出要的类的全路径 Class<?> c3 = Class.forName("com.test812.Student"); System.out.println(c1==c3); } }
2.3反射获取类方法并使用
2.3.1反射获取类构造方法
获取构造函数的数组
public class ReflecGetCon {
public static void main(String[] args) throws ClassNotFoundException{
Class<?> c1 = Class.forName("com.test812.Student"); //获取到公共的构造方法数组 Constructor[] Con1 = c1.getConstructors(); //获取到私有和默认的构造方法数组 Constructor[] con2 = c1.getDeclaredConstructors(); } }
获取指定构造函数,并利用反射创建对象
public class ReflecGetCon1 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> c1 = Class.forName("com.test812.Student"); //Constructor类提供了一个类的单个构造函数的信息和访问权限 //获取到指定的公共构造方法,参数表示你要获取到的构造方法的参数的个数和类型 Constructor<?> con3 = c1.getConstructor();//这里指定的是无参构造方法 //通过构造方法对象,利用提供的newInstance创建对象,这里是构造方法的反射 Object obj = con3.newInstance(); //获取到所有的构造方法数组 //Constructor con24 = c1.getDeclaredConstructor(); } }
获取带参数的构造函数,并利用反射创建对象
public class ReflecgetCon2 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
Class<?> s = Class.forName("com.test812.Student"); //获取带参数的公共构造类 Constructor<?> con = s.getConstructor(String.class, int.class); //利用Constructor的newInstance方法创建对象 Object obj = con.newInstance("Bala",22); } }
暴力反射:一般不能非本类中用私有方法,但通过setAccessible可暴力反射,取消访问检查
public class ReflecgetCon2 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException {
Class<?> s = Class.forName("com.test812.Student"); //获取带参数的公共构造类 Constructor<?> con = s.getDeclaredConstructor(String.class, int.class); con.setAccessible(true); //利用Constructor的newInstance方法创建对象 Object obj = con.newInstance("Bala",22); } }
2.3.2反射获取类的成员变量
获取成员变量的数组或者单个成员变量
public class ReflecgetVar {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> con = Class.forName("com.test812.Student"); //获取成员变量的数组 //Field[] f1 = con.getFields();//获取公共的成员变量数组 //Field[] f2 = con.getDeclaredFields();//获取所有的成员变量数组 //用反射创建对象 Constructor<?> c = con.getConstructor(); Object obj = c.newInstance(); //获取具体公共的成员变量,提供成员变量的名称 Field f3 = con.getField("address"); //调用Field的方法给成员变量赋值 f3.set(obj,"中国"); //获取具体任意的成员变量,提供成员变量的名称 Field f4 = con.getDeclaredField("name"); //为私有变量时,要取消访问检查 f4.setAccessible(true); //调用Field的方法给成员变量赋值 f4.set(obj,"Bala"); } }
2.3.2反射获取成员方法
调用私有的时候,要取消访问检查
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/151890.html