黑马程序员----------反射
来源:互联网 发布:程序员眼镜 编辑:程序博客网 时间:2024/04/30 08:33
------- android培训、java培训、期待与您交流! ----------
反射
反射技术:动态的获取类以及类中的成员,并可以调用该类成员,获取指定类的名称,并建立该类的对象
反射技术的出现提高了程序的扩展性。
无论new 什么对象,都需要先获取字节码文件
如何获取字节码文件?
Java对字节码文件进行了描述用Class类完成
获取字节码文件Class的对象呢
方式一:object中的getClass();方法,但是在反射技术中不合适,因为反射技术中并不明确具体类
Person p=new Person();
Class clazz=p.get Class();
Syso(clazz);
方式二:所有的数据类型都有自己对应的Class对象,表示方法很简单,每一个数据类型都有一个默认的静态属性.class,用该属性就可以获取到字节码文件。
虽然不用对象调用,还是需要用具体的类调用静态属性。
Class clazz=Person.class;
Syso(clazz);
*方式三:在Class中有forName方法,通过名称就可以获取对应的字节码对象
String className=”类名(注意:要写入全部路径目录)”;
Classclazz=Class.forName(className);
Syso(clazz);
如何根据指定名称获取到指定的Class对象后建立该类的对象呢?
获取对象(空参)
//获取Class文件
String className=””;
Classclazz=Class.forName(className);
//创建对象
Object obj=clazz.newInstance();//创建了一个对象,默认调用该类的控参数构造函数,一般被反射的类通常都有空参数的构造函数
动态的创建对象根据指定的构造函数
先获取指定的构造函数,在通过该构造函数进行实例化
//获取Class文件
String className=””;
Classclazz=Class.forName(className);
//通过Class获取指定构造函数
Constructorcons=clazz.getConstructor(String .class, int.class);//传入类型对象
//通过指定的构造器对象进行对象的初始化
Object obj=cons.newInstance(“”,);//传入实参
Syso(obj);
动态的获取字段+暴力反射
//获取Class文件
String className=””;
Classclazz=Class.forName(className);
//获取指定字段
Field field=clazz.getField(“age”)//该方法只获取共有的
Fieldfield=clazz.getDeclaredField(“age”);//获取私有的
//对非静态的字段必须有对象
Object obj=clazz.getIntance();
//使用父类的方法将访问权限检查能力取消
Field.setAccessible(true);//暴力访问
field.set(obj,40);
syso(field.get(obj));
动态的获取指定方法
String className=””;
Classclazz=forName(className);
//反射非静态,无参数的方法
Method method=clazz.getMethod(“方法名”,null);
Objectobj=clazz.newInstance();
method.invoke(obj,null);
//反射静态,无参数的方法
Method method=clazz.getMathod(“方法名”,null);
method.invoke(null,null);
//反射非静态,有参数的方法
Method method=clazz.getMethod(“方法名”,String.class,int.class);//填方法名,类型对象
//创建对象
Objectobj=clazz.newInstance();
//传递实参
method.invoke(obj,”xiaoqiang”,20);
数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的class实例对象
基本数据类型的一维数组可被当做Object类型使用,不能当做Object[]类型使用,非基本数据类型的一维数组都可以
Class Test{
main(){
String className=args[0];
MethodmainMethod=Class.forName(classNmae).getMethod(“main”,String[].class);
mainMethod.invoke(null,newObject[]{new String[]{“111”,”222”}});
}
}
Class TestArgument{
Main(){
For(String arg:args){
Syso(arg)
}
}
}
集合框架的反射
public static void main(String[] args) throwsException{
InputStream ips=new FileInputStream("config.properties");
Properties prop=new Properties();
prop.load(ips);
ips.close();
StringclassName=prop.getProperty("className");
//Collectioncoll=(Collection)Class.forName(className).newInstance();
Classclazz=Class.forName(className);
Collection coll=(Collection)clazz.newInstance();
coll.add("a");
coll.add("a");
System.out.println(coll.size());
}
- 黑马程序员--java 反射
- 黑马程序员之反射
- 黑马程序员之反射
- 黑马程序员__java_反射
- 黑马程序员_反射
- 黑马程序员 反射
- 黑马程序员--Java反射
- 黑马程序员--反射
- 黑马程序员-java-反射
- 黑马程序员:反射技术
- 黑马程序员_java反射
- 黑马程序员---反射
- 黑马程序员-反射
- 黑马程序员---反射
- 黑马程序员_反射
- 黑马程序员_反射
- 黑马程序员:反射
- 黑马程序员_反射
- 使用反射调用自身的成员函数
- 黑马程序员----------JDK1.5新特性
- 安卓第一天(工程目录)
- MVC3中 ViewBag、ViewData和TempData的使用和区别
- UVa 1225 - Digit Counting
- 黑马程序员----------反射
- C#中怎么通过IP访问数据库?
- 杨氏矩阵查找
- 通过外网IP访问数据库
- 面试时,你会问面试官哪些问题?
- 【重读设计模式】桥接模式
- BZOJ 2190 [SDOI2008]仪仗队
- MD5Helper的方法
- uva 417 map暴力