首先自定义一个类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. Ubuntu 18.04 截图工具 Shutter(可以标记重点)-安装及使用

    Shutter 是一个功能丰富的屏幕截图程序.您可以屏幕的某个特定区域.特定的窗口. 或者是整个屏幕,甚至一整个网站截图.可以对截图应用各种效果,标记重点,然后上 传到一个图片托管网站——所有的任务在 ...

  2. Vagrant 手册之 Vagrantfile - 提示及技巧

    原文地址 Vagrantfile 是一种非常灵活的配置格式.语法基于 Ruby,可以用它做很多事情.在本页使用一些提示和技巧时,请注意正确使用它们. 1. 使用循环定义虚拟机 如果你想对多机器应用稍微 ...

  3. 面向JVM的应用程序的项目结构

    对于Maven所用的项目结构,称为Maven标准的目录结构,不包含git 一.一个典型的源代码结构: / [project-name] README.txt LICENSE.txt pom.xml / ...

  4. 无法启动Sql Server服务

    本文首发地址为hilsion的博客 今天遇到一个无法启动SQL Server服务的问题,具体报错如下: 根据错误提示,去到WINDOWS的事件查看器.在WIN10上,右击右下角的菜单图标: 然后依次点 ...

  5. Macaca的Python的api整理

    整理了下Macaca的API,做成思维脑图,方便阅览. WebDriver 安装 pip install wd git clone https://github.com/macacajs/wd.py. ...

  6. Python入门习题10.河内塔(汉诺塔)问题

    例10 共n个圆盘,a,b,c三根柱子 #汉诺塔问题.py def Hanoi(n): #定义n阶汉诺塔问题移动次数函数 if n == 1: return 1 else: return 2*Hano ...

  7. spark连接hive找不到table

    Caused by: org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'xxxx' not fou ...

  8. 关于URL和URI的最简单理解

    以下面网址为例: http://www.sina.com/news/1.html 那么,http://www.sina.com/news/1.html就表示URL,用于标识互联网中的某一资源:/new ...

  9. JVM(7)之 从GC日志分析堆内存

    开发十年,就只剩下这套架构体系了! >>>   在前面的文章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和 ...

  10. 【问题解决方案】Mathtype中丢失Mplugin.dll的问题

    网络上搜索到的答案: Mathtype中丢失Mplugin.dll,把Mplugin.dll文件放到Mathtype安装根目录下就好了. 然而试过以后仍然不行 事实是: 如果下载的mathtype安装 ...