首先自定义一个类Person

package reflection;

public class Person {

    private String name;
public int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
} public Person(String name) {
super();
this.name = name;
}
public void show() {
System.out.println("我是一个人");
}
private String showNation(String nation){
System.out.println("我的国籍是"+nation);
return nation;
}
}

然后是反射的一些操作

package reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties; import org.junit.jupiter.api.Test; public class ReflectionTest { @Test
public void test1() throws Exception {
Person p1 = new Person("Tom",12); //1.通过反射,创建Person类的对象
Class clazz = Person.class;
Constructor cons = clazz.getDeclaredConstructor(String.class,int.class); Object obj = cons.newInstance("Tom",12);
Person p = (Person)obj;
System.out.println(p.toString()); //2.通过反射,调用对象指定的属性
Field age = clazz.getDeclaredField("age");
age.set(p, 10);
System.out.println(p.toString()); //3.通过反射,调用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p); System.out.println("**********************************************************");
} /*
* 反射调用私有方法和属性
* */
@Test
public void test2() throws Exception{
try {
//通过反射调用私有的方法和属性
Class clazz = Person.class;
//1.调用私有构造器
Constructor cons1 = clazz.getDeclaredConstructor(String.class);
cons1.setAccessible(true);
Person person = (Person)cons1.newInstance("zsben");
System.out.println(person); //2.调用私有属性
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
name.set(person, "Lilei");
System.out.println(person); //3.调用私有方法
Method showNation = clazz.getDeclaredMethod("showNation",String.class);
showNation.setAccessible(true);
showNation.invoke(person, "中国"); //4.获得私有方法的返回值
String string = (String)showNation.invoke(person, "中国");
System.out.println(string);
} catch (Exception e) { e.printStackTrace();
}
} /* 关于Class类的理解
* 1.类的加载过程:使用java.exe命令对某个字节码文件进行解释运行,
* 相当于将某个字节码文件加载到内存中,称为类的加载,加载到内存中的类,称其为运行时类
* 此运行时类就作为Class的一个实例
* 2.Class的实例对应着一个运行时类
* 3.加载到内存中的运行时类,会缓存一定的时间之内,我们可以通过不同的方式获取此运行时类
*
* */
/*
* 获取Class实例的四种方式
* */
@Test
public void test3() throws ClassNotFoundException {
//方式1:调用运行时类的属性;Class后面不加泛型也可以
Class<Person> clazz1 = Person.class;
System.out.println(clazz1); //方法2:通过运行时类的对象
Person p1 = new Person();
Class clazz2 = p1.getClass();
System.out.println(clazz2); //方式3:调用Class静态方法forName(String classpath),classpath为类所在路径
Class clazz3 = Class.forName("reflection.Person");
System.out.println(clazz3); //方式4.使用类的加载器
ClassLoader classLoader = ReflectionTest.class.getClassLoader();
classLoader.loadClass("reflection.Person");
Class clazz4 = classLoader.loadClass("reflection.Person"); System.out.println(clazz1==clazz2);
System.out.println(clazz1==clazz3);
System.out.println(clazz1==clazz4);
} }

类加载器的理解

package reflection;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties; import org.junit.jupiter.api.Test;
/*
* 类的加载过程:
* 1.类的加载:将类的class文件读入内存,并为之创建Class对象,此过程由类加载器完成
* 2.类的链接:将类的二进制数据合并到JRE中,设置static变量的默认值(0,null,""等)
* 3.类的初始化:JVM负责初始化,按顺序执行执行静态代码块和类属性的赋值
*
* */ /*
* 了解类的加载器
*
* */ public class ClassLoaderTest {
@Test
public void test1() {
//对于自定义类,得到ClassLoaderTest的类加载器:属于System Classloader,即系统类加载器
ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
System.out.println(classLoader); //调用系统类加载器的getParent().得到Extension Classloader,即扩展类加载器
ClassLoader classLoader2 = classLoader.getParent();
System.out.println(classLoader2); //Bootstap Classloader负责加载java核心类库,得不到了
ClassLoader classLoader3 = classLoader2.getParent();
System.out.println(classLoader3); //和3同理,String是java核心类库的
ClassLoader classLoader4 = String.class.getClassLoader();
System.out.println(classLoader4);
} //读取读取配置文件
@Test
public void test4() throws Exception {
//方式1
Properties pros = new Properties();
FileInputStream fis = new FileInputStream("jdbc.properties");
pros.load(fis); String user = pros.getProperty("user");
String passwd = pros.getProperty("password");
System.out.println(user+passwd); } }

通过反射创建运行时类的对象

package reflection;

import org.junit.jupiter.api.Test;

/*
* 通过反射创建对应的运行时类的对象
* */ public class NewInstanceTest { @Test
public void test1() throws InstantiationException, IllegalAccessException {//实例化异常, 权限异常
Class<Person> clazz = Person.class;
Object object = clazz.newInstance();
System.out.println(object); /*
* newInstance()创建对应的运行时 类的对象
* 内部调用了空参数构造器
* */ Person person = clazz.newInstance();//这儿直接能得到person类运行时类对象
System.out.println(person);
} @Test
public void test2() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
String classPath = "";
classPath = "java.util.Date";
System.out.println(getInstance(classPath));
classPath = "reflection.Person";
System.out.println(getInstance(classPath));
}
//此方法创建一个指定全类名的实例
public Object getInstance(String classPath) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class clazz = Class.forName(classPath);
return clazz.newInstance();
}
}

java 反射,类的加载过程以及Classloader类加载器的更多相关文章

  1. Java类的加载过程与ClassLoader的理解及测试

    当程序准备运行某个类,但该类还未被加载到内存中时,会经过以下三个步骤进行类的加载: 类的加载(Load)→类的连接(Link)→类的初始化(Initialize) 加载:类经过javac.exe编译的 ...

  2. Java类的加载过程-重点!!

    java类的加载过程有以下几步共同完成: 加载->连接->初始化.连接又分为验证.准备.解析 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以 ...

  3. JAVA - 类的加载过程

    JAVA - 类的加载过程 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化. 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class对象 ...

  4. Dubbo源码解析之SPI(一):扩展类的加载过程

    Dubbo是一款开源的.高性能且轻量级的Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用.智能容错和负载均衡,以及服务自动注册和发现. Dubbo最早是阿里公司内部的RPC框架,于 ...

  5. 第42天学习打卡(Class类 Class类的常用方法 内存分析 类的加载过程 类加载器 反射操作泛型 反射操作注解)

    Class类 对象照镜子后得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含了特定某个结构(cla ...

  6. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  7. java类的加载过程

    1.类的加载顺序 (1)JVM在首次加载类时会对  静态初始化块.静态成员变量. 静态方法进行一次初始化. (2)只有在调用new方法时才会创建类的实例. (3)对象创建过程: 首先执行父类(如果有) ...

  8. Java 类的加载过程(阿里面试题)

    问以下程序打印出什么内容: 问题及解析如下: /** * 加载方法不等于执行方法,初始化变量则会赋值 * 类加载顺序应为 加载静态方法-初始化静态变量-执行静态代码块 * 实例化时 先加载非静态方法- ...

  9. 【Spring源码分析系列】启动component-scan类扫描加载过程

    原文地址:http://blog.csdn.net/xieyuooo/article/details/9089441/ 在spring 3.0以上大家都一般会配置一个Servelet,如下所示: &l ...

随机推荐

  1. day18—Flex弹性布局详解(二)

    转行学开发,代码100天——2018-04-03 2.6 align-content属性 align-content 属性定义了在交叉轴方向对齐方式和额外空间分配,类似于justify-content ...

  2. Memecached 服务器安装(一)

    Memecached 服务器安装(一) 前提:首先您的php环境已经安装完成,如若没有则参考 http://www.cnblogs.com/xulele/p/5264781.html 安装环境链接:h ...

  3. postgresql中实现按周统计详解

    SELECT EXTRACT(DOW FROM CURRENT_DATE);   执行结果如下. 这个SQL语句的意思就是计算当前日期是一周中的第几天. EXTRACT(DOW FROM CURREN ...

  4. Windows系统CVE整理

    CVE-2018-8420(RCE) 受影响版本: Microsoft Windows 10 Version 1607 for 32-bit Systems Microsoft Windows 10 ...

  5. git团队协作代码提交步骤

    我们公司由五个人同时开发一个项目,大佬建好仓库后叫我们统一提交到dev这个分支,我的分支是hardy,你们只要将这两个值改成你们团队协作中使用的分支即可.代码如下: git add . git com ...

  6. Linux多线程服务器端编程

    目录 Linux多线程服务器端编程 线程安全的对象生命期管理 对象的销毁线程比较难 线程同步精要 借shared_ptr实现写时拷贝(copy-on-write) 多线程服务器的适用场合与常用编程模型 ...

  7. Django+python报错与解决方法

    编码信息导致修改django文件下的debug.py文件331行的编码格式 with Path(CURRENT_DIR, 'templates', 'technical_500.html').open ...

  8. python操作mysql之增删改查

    [insert] import MySQLdb conn = MySQLdb.connect(","08day5" ) cur = conn.cursor() #把数据放 ...

  9. python3 -tensorflow-dataset 之map函数 lambda隐函数的应用

    ###隐函数lanbda及map函数的应用实例 ''' lambda 参数1,参数2,参数3,...:表达式 ''' f = lambda x,y :x+y print(f(1,2)) ###输出3 ...

  10. ichunqiu在线挑战--网站综合渗透实验 writeup

    挑战链接:http://www.ichunqiu.com/tiaozhan/111 知识点:后台弱口令,md5破解,SQL Injection,写一句话木马,敏感信息泄露, 提权,登陆密码破解 这个挑 ...