package com.smart.reflect;

public class Car {

    private String brand;
private String color;
private int maxSpeed; //默认构造函数
public Car(){} //带参构造函数
public Car(String brand, String color, int maxSpeed) {
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
} //未带参方法
public void introduce() {
System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:" + maxSpeed);
} public String getBrand() {
return brand;
} public void setBrand(String brand) {
this.brand = brand;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public int getMaxSpeed() {
return maxSpeed;
} public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
}
}
package com.smart.reflect;

import sun.reflect.CallerSensitive;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method; public class ReflectTest { public static Car initByDefaultConst() throws Throwable { /*
类装载器工作机制:
(1)装载:查找和导入Class文件
(2)链接:
1.校验:检查载入Class文件数据的正确性
2.准备:给类的静态变量分配存储空间
3.解析:将符号引用转化为直接引用(可选)
(3)初始化:对类的静态变量、静态代码块执行初始化工作
*/ // 1. 通过类加载器获取Car类对象
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Class clazz = loader.loadClass("com.smart.reflect.Car"); // 2. 获取类的默认构造器对象并通过它实例化Car
Constructor constructor = clazz.getConstructor((Class[]) null);
Car car = (Car) constructor.newInstance(); // 3. 通过反射方法设置属性
Method setBrand = clazz.getMethod("setBrand", String.class);
setBrand.invoke(car, "红旗CA72");
Method setColor = clazz.getMethod("setColor", String.class);
setColor.invoke(car, "黑色");
Method setMaxSpeed = clazz.getMethod("setMaxSpeed", int.class);
setMaxSpeed.invoke(car, 200); return car;
} public static void main(String[] args) throws Throwable {
Car car = initByDefaultConst();
car.introduce(); //JVM装载类时使用“全盘负责委托机制”
// 1.当一个ClassLoader装载一个类时,除非显式的使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入
// 2.先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类
}
}

最新文章

  1. 在 CentOS7 上安装 MongoDB
  2. QT_BEGIN_NAMESPACE QT_END_NAMESPACE
  3. Webpack使用教程四(Loaders)
  4. Flipping Parentheses(CSU1542 线段树)
  5. Relevance Between Variable Declaration and Definition in C++
  6. IOS SWIFT基本画图教程
  7. ecshop收货地址货到付款修改
  8. Qt5.11.1安装与VS2017配置
  9. Cloud Foundry v2 部署及入门运维
  10. 你真的理解PeopleSoft的Web概要(web profile)嘛
  11. CentOS 7 使用 Yum 软件源安装谷歌 Chrome 浏览器
  12. http断点下载客户端和服务端
  13. 实现linux下的ls
  14. 【Android UI设计与开发】使用ViewPager实现欢迎引导页面
  15. 深入了解JavaScript中的Symbol的使用方法
  16. 从细节处谈Android冷启动优化
  17. 浅谈块元素绝对定位的margin属性
  18. spring启动加载过程源码分析
  19. AB二进制
  20. 添加.pch文件

热门文章

  1. VMware 报错“Intel VT-x处于禁止状态”
  2. kinect/xiton 的环境搭建 + rgb图像和深度图的标定
  3. HTML5颜色渐变3D文字特效
  4. EASYARM-IMX283 制作ubifs文件系统
  5. u盘安装debian 7(Wheezy) stabe
  6. eclipse(myeclipse) author的默认名字
  7. zabbix haproxy 监控
  8. ffmpeg 调试
  9. 鸟哥的linux私房菜 - 第5/6/7/9章(在线求助 man page、Linux档案权限与目录配置、Linux档案与目录管理、压缩与打包)
  10. 改变Ecplise项目窗口字体样式