java从入门到弃坑十七><
来源:互联网 发布:淘宝千人千面 编辑:程序博客网 时间:2024/06/07 05:08
1.类加载器:程序加载某个类时,若类不在内存中,就会通过加载连接初始化三部实现对类的初始化。
加载:将class文件读入内存并为之创建一个Class对象
链接:验证内部结构,为静态成员分配内存,设置默认初始化值,将类的二进制数据符号引用替换为直接引用
初始化:为变量赋初值
2.类的加载时机:A:创建类的实例 B:访问类的静态变量或为静态变量赋值 C:调用类的静态方法
D:使用反射方式强制创建类或接口的java.lang.Class对象 E:初始化某个类的子类
F:直接使用java.exe命令来运行某个主类
3.加载器分类:A:Bootstrap ClassLoader 根类加载器,负责java核心类的加载,在JDK中JRE的lib目录下rt.jar文件中
B:Extension ClassLoader 扩展类加载器,负责JRE扩展类jre包的加载,在JDK中JRE的lib目录下ext
目录
C:Sysetm ClassLoader 系统类加载器,负责JVM启动时来自java程序的Class文件
4.反射:通过字节码文件去使用成员的过程该文件为类名.class文件
获取文件对象的方式:A:Object类的getClass()方法
B:数据类型的静态class属性
C:Class类的静态方法forName()
package Reflect;public class Demo1 {public static void main(String[] args) throws Exception {Person p1=new Person();Class c1=p1.getClass();//Object类的getClass()方法Class c2=Person.class;//数据类型的静态class属性Class c3=Class.forName("Reflect.Person");//C:Class类的静态方法forName()System.out.println(c1.getName());//Reflect.Person System.out.println(c2.getName());//Reflect.Person System.out.println(c3.getName());//Reflect.Person
}}
一般直接使用第二种最方便,但第三种可以把参数作为配置文件的内容
5.反射的使用步骤:成员变量Field,构造方法 Constructor,成员方法 Method,用class字节码文件对象得到对应的成
员对象,在通过该成员对象调用方法使用
6.通过反射获取构造方法:
A:public Constructor[] getConstructors() 获取公共的构造方法
ublic Constructor[] getDeclaredConstructors() 获取所有的构造方法(包括私有)
B:public Constructor getConstructor(Class... parameterTypes) 根据构造参数获取公共的指定构造
public Constructor getDeclaredConstructor(Class<?>... parameterTypes) 根据构造参数获取指定构造(包括私
有,但是私有在使用的时候需要取消访问限制)
public class Person {@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}private String name;private int age;public Person() {super();// TODO Auto-generated constructor stub}public Person(String name, int age) {super();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;}}exp:通过反射获取构造方法并创建对象
import java.lang.reflect.Constructor;public class Demo2 {public static void main(String[] args) throws Exception {Constructor[] p=Person.class.getConstructors(); Constructor p2=Person.class.getDeclaredConstructor(String.class,int.class); for (Constructor c : p) {System.out.println(c);//获取所有构造方法} p2.setAccessible(true);//取消访问限制 Object obj=p2.newInstance("a",1);//利用反射创建对象 System.out.println(obj);}}
7.通过反射获取成员变量并使用
import java.lang.reflect.Constructor;import java.lang.reflect.Field;/* * public Field[] getFields()获取公有的成员变量 public Field[] getDeclaredFields()获取全部的成员变量,包括私有 public Field getDeclaredField(String name) 传入变量名称返回指定的成员变量对象,包括私有 public Field getField(String name)传入变量名称返回指定的成员变量对象,仅可获取共有的 public void set(Object obj,Object value) 给一个对象的一个字段设置一个值 */public class Demo3 {public static void main(String[] args) throws Exception {Class c=Class.forName("Reflect.Person");Constructor con=c.getDeclaredConstructor();Object obj=con.newInstance();//通过反射创建对象Field[] f=c.getDeclaredFields();//获取全部变量(包括私有)for (Field field : f) {//增强for遍历获取的变量System.out.println(field);}Field f1=c.getDeclaredField("name");//反射获取变量Field f2=c.getDeclaredField("age");f1.setAccessible(true);//取消检测f2.setAccessible(true);f1.set(obj,"a");//通过反射给变量赋值f2.set(obj, 1);System.out.println(obj);}}
8.通过反射获取成员方法并使用
/*public Method[] getMethods()获取所有公共成员方法 public Method[] getDeclaredMethods()获取所有成员方法,包括私有 public Method getMethod(String name, Class<?>... parameterTypes)参数一:方法名 参数二:方法参数类型.class 获取指定的公共方法 public Method getDeclaredMethod(String name,Class<?>... parameterTypes)参数一:方法名 参数二:方法参数类型.class 获取指定的方法,包括私有 Object invoke(Object obj, Object... args) 让某一个对象使用这个方法,并且传入参数*/import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class Demo4 {public static void main(String[] args) throws Exception {Class c=Class.forName("Reflect.Person");Constructor con=c.getConstructor();//反射创建对象Object obj=con.newInstance();Method [] m=c.getDeclaredMethods();//反射获取成员方法for (Method method : m) {System.out.println(method);}Method m1=c.getDeclaredMethod("setName",String.class);//使用方法Method m2=c.getDeclaredMethod("getName");m1.invoke(obj, "a");m2.invoke(obj);System.out.println(obj);}}
- java从入门到弃坑十七><
- java入门学习(十七) 递归
- Golang从入门到精通(十七):Golang反射
- java从入门到弃坑第二天
- java从入门到弃坑第四天
- java从入门到弃坑第六天
- java从入门到弃坑第十天
- java从入门到弃坑第十一天
- java从入门到弃坑第十二天
- java从入门到弃坑十六夜
- java从入门到弃坑数据库0 0
- java从入门到弃坑数据库二
- java从入门到弃坑数据库三
- java从入门到弃坑数据库终
- java程序员从笨鸟到菜鸟之(十七)练习题
- java从入门到超神
- Android入门/Drawable(十七)
- MySQL---数据库从入门走向大神系列(十七)-JavaWeb分页技术实例演示2
- Android Intent机制
- Oracle数据库索引
- 解决<input type=“file” multiple> 多文件上传问题(可以多次选取文件,也可以一次选取多个文件),而且点击的是一个同一个div
- java编程思想读书笔记二:一切都是对象
- 使用C#编程解决数独求解(从图片识别到数独求解)
- java从入门到弃坑十七><
- 蓝桥杯单片机 基础篇1——————数码管的显示
- 系统事件触发器
- java按多个分割符分割字符串
- BZOJ3390: [Usaco2004 Dec]Bad Cowtractors牛的报复
- php设置允许跨域
- CDN选择合适的回源策略很重要
- 八年老司机总结了产品工作的5大神坑
- 20 张赤裸裸的人性图,你敢看吗?