黑马程序员——Java基础--反射
2015-08-16 22:00
399 查看
-------
android培训、java培训、期待与您交流! ----------
一 加载器
类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
类加载器负责将.class文件加载到内在中,并为之生成对应的Class对象。
类加载器的组成:
Bootstrap ClassLoader 根类加载器,负责Java核心类的加载;
Extension ClassLoader 扩展类加载器,负责JRE的扩展目录中jar包的加载;
System ClassLoader 系统类加载器,负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。
二 反射
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
创建一个Person类:public class Person {
public String name;
public int age;
public Person(){
System.out.println("空参构造方法");
}
public Person(String name,int age){
this.age = age;
this.name = name;
System.out.println("2个参数的构造方法");
}
private Person(String name){
this.name = name;
System.out.println("私有构造方法");
}
public void show(){
System.out.println("show方法");
}
public void function(String name,double d){
System.out.println(name+"..."+d);
}
public String toString(){
return "Person "+name+" "+age;
}
}
获取一个类的class文件对象的三种方式:
第一种:类的对象获取,对象调用方法getClass()获取
第二种:类的静态属性获取,静态属性.class获取
第三种:使用Class类静态方法forName获取
public class ReflectDemo {
public static void main(String[] args)throws Exception {
Person p = new Person();
//通过父类方法getClass获取
Class c1 = p.getClass();
System.out.println(c1);
//通过类的静态属性class获取
Class c2 = Person.class;
System.out.println(c2);
//使用Class类的静态方法forName获取,全类名
Class c3 = Class.forName("reflect.Person");
System.out.println(c3);
}
}
通过反射获取构造方法:
public class ReflectDemo2 {
public static void main(String[] args)throws Exception {
//获取class文件对象
Class c = Class.forName("cn.itcast.reflect.Person");
//通过Class类的方法getConstructor获取指定构造方法
Constructor con = c.getConstructor(String.class,int.class);
//使用Constructor类的方法newInstance()运行构造方法
Object obj = con.newInstance("haha",30);
System.out.println(obj);
}
}
通过反射获取成员变量:
public class ReflectDemo5 {
public static void main(String[] args) throws Exception{
Class c = Class.forName("cn.itcast.reflect.Person");
Object obj = c.newInstance();
//调用Class类的方法getField(变量名)获取指定成员变量,公共权限
Field field = c.getField("name");
//调用Field类的方法set修改成员变量值
field.set(obj, "lisi");
System.out.println(obj);
}
}
通过反射获取成员方法:
public class ReflectDemo7 {
public static void main(String[] args) throws Exception{
Class c = Class.forName("cn.itcast.reflect.Person");
Object obj = c.newInstance();
//Class类的方法getMethod获取指定的方法function,参数是字符串,double
Method method = c.getMethod("function", String.class,double.class);
method.invoke(obj, "调用方法",0.01);
}
}
暴力反射:
私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。 方法:method.setAccessible(true);一般很少用,因为私有就是隐藏起来,所以尽量不要访问。
import java.lang.reflect.*;
class ReflectPoint {
private int priVar;
public ReflectPoint(int priVar){
this.priVar =priVar;
}
}
public class Demo {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3);
Field fieldx = pt1.getClass().getDeclaredField("priVar");
fieldx.setAccessible(true);
fieldx.set(pt1, 100);
System.out.println(fieldx.get(pt1));
}
}
android培训、java培训、期待与您交流! ----------
一 加载器
类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
类加载器负责将.class文件加载到内在中,并为之生成对应的Class对象。
类加载器的组成:
Bootstrap ClassLoader 根类加载器,负责Java核心类的加载;
Extension ClassLoader 扩展类加载器,负责JRE的扩展目录中jar包的加载;
System ClassLoader 系统类加载器,负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。
二 反射
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
创建一个Person类:public class Person {
public String name;
public int age;
public Person(){
System.out.println("空参构造方法");
}
public Person(String name,int age){
this.age = age;
this.name = name;
System.out.println("2个参数的构造方法");
}
private Person(String name){
this.name = name;
System.out.println("私有构造方法");
}
public void show(){
System.out.println("show方法");
}
public void function(String name,double d){
System.out.println(name+"..."+d);
}
public String toString(){
return "Person "+name+" "+age;
}
}
获取一个类的class文件对象的三种方式:
第一种:类的对象获取,对象调用方法getClass()获取
第二种:类的静态属性获取,静态属性.class获取
第三种:使用Class类静态方法forName获取
public class ReflectDemo {
public static void main(String[] args)throws Exception {
Person p = new Person();
//通过父类方法getClass获取
Class c1 = p.getClass();
System.out.println(c1);
//通过类的静态属性class获取
Class c2 = Person.class;
System.out.println(c2);
//使用Class类的静态方法forName获取,全类名
Class c3 = Class.forName("reflect.Person");
System.out.println(c3);
}
}
通过反射获取构造方法:
public class ReflectDemo2 {
public static void main(String[] args)throws Exception {
//获取class文件对象
Class c = Class.forName("cn.itcast.reflect.Person");
//通过Class类的方法getConstructor获取指定构造方法
Constructor con = c.getConstructor(String.class,int.class);
//使用Constructor类的方法newInstance()运行构造方法
Object obj = con.newInstance("haha",30);
System.out.println(obj);
}
}
通过反射获取成员变量:
public class ReflectDemo5 {
public static void main(String[] args) throws Exception{
Class c = Class.forName("cn.itcast.reflect.Person");
Object obj = c.newInstance();
//调用Class类的方法getField(变量名)获取指定成员变量,公共权限
Field field = c.getField("name");
//调用Field类的方法set修改成员变量值
field.set(obj, "lisi");
System.out.println(obj);
}
}
通过反射获取成员方法:
public class ReflectDemo7 {
public static void main(String[] args) throws Exception{
Class c = Class.forName("cn.itcast.reflect.Person");
Object obj = c.newInstance();
//Class类的方法getMethod获取指定的方法function,参数是字符串,double
Method method = c.getMethod("function", String.class,double.class);
method.invoke(obj, "调用方法",0.01);
}
}
暴力反射:
私有方法不能直接访问,因为权限不够。非要访问,可以通过暴力的方式。 方法:method.setAccessible(true);一般很少用,因为私有就是隐藏起来,所以尽量不要访问。
import java.lang.reflect.*;
class ReflectPoint {
private int priVar;
public ReflectPoint(int priVar){
this.priVar =priVar;
}
}
public class Demo {
public static void main(String[] args) throws Exception {
ReflectPoint pt1 = new ReflectPoint(3);
Field fieldx = pt1.getClass().getDeclaredField("priVar");
fieldx.setAccessible(true);
fieldx.set(pt1, 100);
System.out.println(fieldx.get(pt1));
}
}
相关文章推荐
- 剑指offer_面试题21_包含min函数的栈
- 黑马程序员——多线程(下)——第12天
- 黑马程序员——多线程(上)——第11天
- 黑马程序员——黑苹果的日记(2)—基础知识总结(1)
- 程序员从优秀到卓越的几点建议
- 20个高级Java面试题汇总
- 9个Java初始化和回收的面试题
- 黑马程序员 单例设计模式
- 史上最全面的面试资料(包含所有IT大公司)
- 黑马程序员——面向对象10(异常下、包)
- 细节决定成败--职场心得
- 黑马程序员 集合框架
- 黑马程序员——面向对象09(内部类、异常上)
- LeetCode解题报告--3Sum Closest
- LeetCode解题报告--3 Sum
- 黑马程序员-----java基础之构造方法
- 黑马程序员 环境的配置问题
- 写给新手程序员的一封信
- 面试题总结
- 黑马程序员——面向对象08(多态)