传智播客-Java基础加强-day2
2011-01-11 11:19
351 查看
反射的基石:Class类
Java程序中各个Java类属于同一类事物,描述这类事物的Java类就是Class类
得到类的字节码的方法有三种:
Person.class 类名字节码
p1.getClass() 得到产生p1实例对象的类的字节码
Class.forName(“java.lang.String”) 得到加载的String类的字节码
例:
package cn.itcast.day1;
public class ReflectTest {
public static void main(String[] args) throws Exception {
String str="abc";
Class cls1=str.getClass(); //得到产生str实例对象的String类的字节码
Class cls2=String.class; //得到String类的字节码
Class cls3=Class.forName("java.lang.String");//得到自动加载的java.lang.String类的字节码
System.out.println(cls1==cls2);//返回true
System.out.println(cls1==cls3);//返回true
}
}
常识:
九个预定义的Class实例对象 :八个基本类型跟viod
反射:就是把Java类中的各个元素映射成相应的Java类;例如:Java类中的Method、Field等也是java类,java类中的Method是Method类的一个实例对象
程序编译时和运行时不俩个不同的概念
反射会导致程序运行速度变慢
构造方法的快捷键:Ctrl+Alt+s
Constructor代表类中的构造方法:
Constructor constructor1=String.class.getConstructor(StringBuffer.class); //获得String对象参数为StrngBuffer.class的构造方法
String str2=(String) constructor1.newInstance(new StringBuffer("abc")); //创建String实例对象,参数必须与获得的构造方法的参数类型相同
Field 代表类中的字段,即成员变量,例如:
package cn.itcast.day1;
public class ReflectPoint {//创建一个点的类
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
(在同目录下另一个可运行的类中测试如下代码)
ReflectPoint p1=new ReflectPoint(3,5); //创建一个点实例对象参数为3,5
Field fieldY=p1.getClass().getField("y");//获得的产生p1的类中的成员y(变量y对象)
Object fy=fieldY.get(p1); //获得实例对象p1中的成员y
System.out.println(fy);
Field fieldX=p1.getClass().getDeclaredField("x");//获得的产生p1的类中的私有成员x(变量x对象)
fieldX.setAccessible(true);//强制私有成员x可以访问
Object fx=fieldX.get(p1); //获得实例对象p1中的成员x
System.out.println(fx);
反射实例:将一个类中的String成员中的字符b换成a:
package cn.itcast.day1;
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args) throws Exception {
ReflectPoint p1=new ReflectPoint();
changeStringValue(p1);
System.out.println(p1);
}
private static void changeStringValue(Object obj) throws Exception {
Field [] fields=obj.getClass().getFields();
for(Field field:fields){
if(field.getType()==String.class){//String类字节码在内存中只有一个,此处最好使用==而不是equals()
String oldValue=(String)field.get(obj);
String newValue=oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}
}
}
class ReflectPoint {//创建一个点的类
public ReflectPoint() {}
public String str1="ball";
public String str2="basketball";
public String str3="itcast";
public String toString(){
return str1+"--"+str2+"-"+str3;
}
}
Java程序中各个Java类属于同一类事物,描述这类事物的Java类就是Class类
得到类的字节码的方法有三种:
Person.class 类名字节码
p1.getClass() 得到产生p1实例对象的类的字节码
Class.forName(“java.lang.String”) 得到加载的String类的字节码
例:
package cn.itcast.day1;
public class ReflectTest {
public static void main(String[] args) throws Exception {
String str="abc";
Class cls1=str.getClass(); //得到产生str实例对象的String类的字节码
Class cls2=String.class; //得到String类的字节码
Class cls3=Class.forName("java.lang.String");//得到自动加载的java.lang.String类的字节码
System.out.println(cls1==cls2);//返回true
System.out.println(cls1==cls3);//返回true
}
}
常识:
九个预定义的Class实例对象 :八个基本类型跟viod
反射:就是把Java类中的各个元素映射成相应的Java类;例如:Java类中的Method、Field等也是java类,java类中的Method是Method类的一个实例对象
程序编译时和运行时不俩个不同的概念
反射会导致程序运行速度变慢
构造方法的快捷键:Ctrl+Alt+s
Constructor代表类中的构造方法:
Constructor constructor1=String.class.getConstructor(StringBuffer.class); //获得String对象参数为StrngBuffer.class的构造方法
String str2=(String) constructor1.newInstance(new StringBuffer("abc")); //创建String实例对象,参数必须与获得的构造方法的参数类型相同
Field 代表类中的字段,即成员变量,例如:
package cn.itcast.day1;
public class ReflectPoint {//创建一个点的类
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
(在同目录下另一个可运行的类中测试如下代码)
ReflectPoint p1=new ReflectPoint(3,5); //创建一个点实例对象参数为3,5
Field fieldY=p1.getClass().getField("y");//获得的产生p1的类中的成员y(变量y对象)
Object fy=fieldY.get(p1); //获得实例对象p1中的成员y
System.out.println(fy);
Field fieldX=p1.getClass().getDeclaredField("x");//获得的产生p1的类中的私有成员x(变量x对象)
fieldX.setAccessible(true);//强制私有成员x可以访问
Object fx=fieldX.get(p1); //获得实例对象p1中的成员x
System.out.println(fx);
反射实例:将一个类中的String成员中的字符b换成a:
package cn.itcast.day1;
import java.lang.reflect.*;
public class ReflectTest {
public static void main(String[] args) throws Exception {
ReflectPoint p1=new ReflectPoint();
changeStringValue(p1);
System.out.println(p1);
}
private static void changeStringValue(Object obj) throws Exception {
Field [] fields=obj.getClass().getFields();
for(Field field:fields){
if(field.getType()==String.class){//String类字节码在内存中只有一个,此处最好使用==而不是equals()
String oldValue=(String)field.get(obj);
String newValue=oldValue.replace('b', 'a');
field.set(obj, newValue);
}
}
}
}
class ReflectPoint {//创建一个点的类
public ReflectPoint() {}
public String str1="ball";
public String str2="basketball";
public String str3="itcast";
public String toString(){
return str1+"--"+str2+"-"+str3;
}
}
相关文章推荐
- 传智播客-Java基础加强-day9
- 传智播客-Java基础加强-day7
- 传智播客-Java基础加强-day11
- 传智播客-Java基础加强-day5
- 传智播客-Java基础加强-day8
- 传智播客168期JavaEE就业班(第七天 Java基础加强)
- 传智播客-Java基础加强-day10
- 传智播客-Java基础加强-day6
- 传智播客——就业班的开始:java基础加强
- 传智播客-Java基础加强-day1
- 传智播客-Java基础加强-day3
- 黑马程序员_张孝祥_Java基础加强_代理
- 黑马程序员--Java基础加强(7)-----代理和AOP(面向方面编程)
- 黑马程序员_java基础加强学习笔记之(JDK1.5新特性)
- JAVA_java基础加强小结
- 黑马程序员 java基础加强--JDK1.5新特性
- java基础加强 + xml + HTTP 笔记整理
- 黑马程序员——Java基础---基础加强
- 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(day11~)(2016年1月27日13:12:11)
- Java基础加强二注解、泛型、类加载器、代理类