java高薪之路__007_反射
参考地址: 1. http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html2. http://www.cnblogs.com/nerxious/archive/2012/12/24/2829446.html3. http://j2megame.blog.163.com/blog/static/140838396201141623654269/4. http://blog.csdn.net/liujiahan629629/article/details/18013523
java.lang.Class 是反射的源头
我们创建了一个类, 通过编译(javac.exe)生成对应的.class文件, 之后我们使用java.exe加载此.class文件(JVM的类加载器完成的), 此.class文件加载到内存后,就是一个运行时类,存在于缓存区,那么这个运行时类本身就是一个Class的实例! 每一个运行时类只加载一次 反射的类的获取方式共有4种1. 通过类的.class属性2. 通过类的对象的getClass()方法3. 通过Class类的静态forName()方法4. 通过类的加载器
package learn.JavaBasics.Class;
import java.io.*;
import java.util.Properties;
class Person{
public String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = 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;
}
}
public class TestReflection {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, FileNotFoundException {
//方法1
Class<Person> clazz = Person.class;
Person p = clazz.newInstance();
//上面是使用了泛型的,也可以不用泛型,然后类型强转
Class clazz1 = Person.class;
Person p1 = (Person) clazz1.newInstance();
//方法2
Person p2 = new Person();
Class clazz2 = p2.getClass();
//方法3
Class clazz3 = Class.forName("learn.JavaBasics.Class.Person");
Person p3 = (Person) clazz3.newInstance();
Class<?> clazz3_1 = Class.forName("learn.JavaBasics.Class.Person");
Person p3_1 = (Person) clazz3_1.newInstance();
//方法4
Class clazz4 = new TestReflection().testClassLoaderReflection();
Person p4 = (Person) clazz4.newInstance();
//关于加载Properties文件的问题
new TestReflection().testProperties();
}
public Class<?> testClassLoaderReflection() throws ClassNotFoundException {
ClassLoader cl = this.getClass().getClassLoader();//this代表的是这个方法,所以不能使用main方法
Class<?> c = cl.loadClass("learn.JavaBasics.Class.Person");
return c;
}
public void testProperties() throws FileNotFoundException {
//1. 如果不在同一个包文件下
ClassLoader loader = this.getClass().getClassLoader();
InputStream in = loader.getResourceAsStream("learn//JavaBasics//Class//jdbc.properties");//前面是包的名字
//2. 在一个包文件下
FileInputStream in1 = new FileInputStream(new File("jdbc1.properties"));
Properties p = new Properties();
try {
p.load(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.getProperty("driver");
}
}
调用默认的newInstance方法,要求被反射的类要有一个无参的构造方法,同时这个无参的构造方法的访问权限也要注意,要能够访问如果没有无参构造方法,只要正确的调用其他的构造方法也可反射类
动态代理
java高薪之路__007_反射的更多相关文章
- java高薪之路__008_Annotation
元注解 共有4种 @Retention 表示需要在什么级别保存该注释信息(生命周期) |--- RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 |--- Reten ...
- java高薪之路__009_网络
1. InetAddress类2. Socket: IP地址和端口号的结合,socket允许程序把网络连接当成一个流,数据在两个socket间通过IO传输, 通信的两端都要有socket. 主动发起通 ...
- java高薪之路__005_IO流
参考地址: 1. http://blog.csdn.net/yczz/article/details/38761237 File类 ObjectInputStream && Objec ...
- java高薪之路__003_集合
Java集合可分为Collection和Map两大体系 Collection接口 |---- Set: 元素无序.不可重复 |---- List: 元素有序.可重复 (动态数组) |---- Queu ...
- java高薪之路__002_异常处理
自定义异常 package learn.JavaBasics.Class; import java.util.Date; /** * 如何自定义一个异常类 * 1. 继承一个现有的异常类 * 2. 提 ...
- java高薪之路__001_类
Java中内部类分四种:成员内部类.局部内部类.静态内部类和匿名内部类.要注意静态内部类的调用方式与其他不同,采用的是类似调用类中的静态属性.静态方法的方式 Multi Level 调用不同类中的相同 ...
- java高薪之路__010_设计模式
设计模式只是一个在构建大型工程时,为了方便更改,添加,查询和管理的一种代码工具,没有必要单独为了设计模式而使用设计模式,使简单的事情复杂化. 总体来说设计模式分为三大类: 1. 创建型模式,共五种 - ...
- java高薪之路__006_多线程
线程的创建有两种方式 package learn.JavaBasics.Class; public class ThreadDemo extends Thread { private static i ...
- java高薪之路__004_泛型
参考地址: 1. http://www.cnblogs.com/lwbqqyumidi/p/3837629.html2. http://www.cnblogs.com/abcwt112/p/47350 ...
随机推荐
- Given a compiled machine-language program, which statements in the source language cause the execution of the most machine-language instructions and what is the execution time of these instr
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION A variety of studi ...
- [转]SQLSERVER如何获取一个数据库中的所有表的名称、一个表中所有字段的名称
1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FR ...
- 【Android测试】【第十六节】Instrumentation——初识+实战
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5503645.html 前言 有朋友给我留言说,能否介绍一下 ...
- 安卓仿微信Tab页用Fragment实现
最终效果图如: 实现步骤: 新建项目tabdemo,我选的是4.0.3版本,然后依次新建三个Fragment,名字分别为:ChatFragment.FriendFragment.FindFragmen ...
- Ubuntu 14.04 升级gcc 4.8到gcc 5.x
简介 有些软件比较新,需要更高的gcc版本,所以需要升级gcc.编译安装比较耗时,所以直接选择bin包就好. 步骤 添加源 sudo add-apt-repository ppa:ubuntu-too ...
- mongoose升级后遇到的问题
由于想在mongoose中使用Q,所以将mongoose升级到了4.1.0,而线上mongoDB的版本是2.6.7,升级的时候,node-modules存在mongoose的残渣,所以调用 npm i ...
- VMware简介
VMware(中文名威睿”) 虚拟机软件,是全球桌面到数据中心虚拟化解决方案的领导厂商.VMware vSphere 是VMware 的一个虚拟化产品,它包括vCenter,ESX Server,ES ...
- Java接口回调
public class A { private D d; private C c; public A (C c) { this.c = c; } public void setD (D d) { t ...
- html5,表单与label标签配套使用
<form action=""><input type="checkbox" name="dx" value=" ...
- 【过程改进】 windows下jenkins常见问题填坑
没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...