您的位置:首页 > 职场人生

黑马程序员-高新反射学习日记

2014-04-23 01:04 344 查看
.---------------------- <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>、期待与您交流! ----------------------


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: