.---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
反射基石 ->Class类
用来描述JAVA类的类就是Class
类被加载到内存后的内容就是字节码。这些字节码被存储的空间被对象来表示,这些对象也存在类型,这种类型就是Class类型。
Person p1 = new Person();
Person p2 = new Person();
Class clas1 = Person.Class; = 字节码
Class clas2 = p1.getClass(); = 字节码
Class.forName("java.lang.String"); 查询或者加载字符串所对应类的字节码。
反射: 就是把JAVA类中的各种成分映射成JAVA类
Constructor类代表某个类中的一个构造方法
String.class.getconstructor(StringBuffer.class) 得到一个构造方法 通过参数类型去获取构造方法的字节码
调用获得的方法时要注意转换类型
Field类:代表某个类中的一个成员变量
RelectPoint ref = new RelectPoint(3,5);
Field fiy = ref.getClass().getField("y");//getField()只可以看到可见的 getDeclareField()可以看见变量但是变量拿不出来
//setAccessible(true); 这就叫做暴力反射
fiy,get(pt1);
字段的反射替换
package heimaLog;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectPoint {
private int x;
public int y;
public String str1 ="ball";
public String str2 ="basketball";
public String str4 ="icted";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
public String toString(){
return str1+"----"+str2+"-----"+str4;
}
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
// TODO Auto-generated method stub
ReflectPoint p1 = new ReflectPoint(3, 4);
changeStringValue(p1);
sop(p1);
}
private static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException{
Field[] fields = obj.getClass().getFields();
for(Field field:fields){
if(field.getType() ==String.class)
{
String oldvalue = (String)field.get(obj);
String newValue =oldvalue.replace('b','a');
field.set(obj,newValue);
}
}
}
public static void sop(Object obj){
System.out.println(obj);
}
}
Method类 代表类中的一个方法
//调用str1.charAt(1);
Method menthodCharAt = String.class.getMethods("charAt",int.class);
jdk1.4与jdk1.5调用invoke()时的区别
jdk1.4中没有可变参数的概念是使用数组的去接收多个参数。
jdk 1.5 menthodCharAt.invoke(str1,1);
jdk 1.4 methodCharAt.invoke(str1,new Object[]{1});
//用反射的方式去调用某个类中的调用mian()方法
class TestArguments{
public staic void main(String[] args){
for(String arg:args){
System.out.println(arg);
}
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
String startintClassName = args[0]; //因为在这里不知道我们到底要调用哪个类所以这时就用到了反射
Method mainMethod = Class.forName(startingClassName).getMethod("main",String[].class);
mainMethod.invoke(null,(Object)new String]{"111","2222","33333"});
数组的反射: 具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
代表数组的Class实例对象的getSupperClass()方法返回的父类为Object类对应的Class.
基本类型的一维数组可以被当做Object类型使用,不能当做Object[] 类型使用,非基本类型的一维数组,既可以当做
Object 类型使用,又可以当做Object[];类型使用
Arrays.asList()方法处理int[]和String[]时的差异:
String数组里存的元素都是String类型的对象
int 数组里存的元素都是int的基本类型数据
asList在Jdk1.4中的参数是 asList(Object[] obj) String[]中的数据是对象,Object[]里的元素也是对象, 符合。
int[]中的数据是基本数据类型,不符合Object中元素是对象的规律
所以不符合jdk1.4中的语法。
所以int[]的数据就被当成了一对象去找jdk1.5中的asList()方法
printObject(obj);
private static void printObject(Object obj){
Class clazz = obj.getClass();
if(clazz.isArray()){
int len = Array.getLength(obj);
for(int i=0;i<len;i++){
System.out.println(Array.get(obj,i));
}
}else{
System.out.println(obj);
}
}
-------------------------------------------------------------------------------------------------------------------------------------------
ArrayList_Hashset的比较及HashCode的分析 在HashCode值被确定后在更改参与HashCode运算的值会导致内存泄露(不需要的内容占用内存空间去无法释放)
-------------------------------------------------------------------------------------------------------------------------------------------
反射的作用 -----> 实现框架功能
用配置文件加反射的方式创建ArrayList和HashSet的实例对象
config.properties
className = java.util.ArrayList
ReflectText2.java
InputStream is =new FileInputStream("config.properties");//用完整的路径不是硬编码,而是运算出来的、 /javaweb中的方法 getRealPath(); 获取整个工程的路径
Properties props =new Properties();
props.load(is);
is.close();
String className = props.getProperty("className");
Collection collecitons = (Collection)Class.forName(ClassName).newInstance();
得到资源配置文件的方式:1.javaweb中的方法 getRealPath(); 获取整个工程的路径
2. .class类加载器 ReflectTest2.class.getClassLoader().getResourceAsStream("类的class文件目录/config.Properties");
ReflectTest2.class.getResourceAsStream("config.Properties");
96.------------------ <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------