黑马程序员——————java中的反射
来源:互联网 发布:mac上的文献管理软件 编辑:程序博客网 时间:2024/04/29 22:42
------- android培训、java培训、期待与您交流! ----------
什么是Java中的类反射:
Reflection是Java程序开发语言的特征之一,它允许运行中的 Java程序对自身进行检查,
或者说“自审”,并能直接操作程序的内部属性和方法,换言之就是把java类中的各种成分映射成为
相应的java类。
反射的基石——>class类:
java中各个类属于同一类事物,描述这个事物的java类就是Class,Class的一个实例对象就是内存中的
一份字节码文件,当我们在程序中使用了某些类的时候,这些类就会被加载进内存,对于这些加载进内
存中的字节码都是一个Class类的对象。
获取字节码对象的三种方式:
1.Class cl=类名.class;
2.也可以同过对象的getClass()方法
Person p=new Person ();
Class cl=p.getClass();
3.还可以用Class类中的forName()静态方法
java中的八种基本数据类型 boolean byte char short int long float double 和void都有对应的Class对象
这九个Class实例对象是预定义的
反射的具体应用:
Java类反射中所必须的类:
Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,
下面我将对这些类做一个简单的说明。
Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个
类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,
Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。
Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法
(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。
Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。
每个数组属于被映射为 Class对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class对象。
Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
下面我们分别来看一看反射中各个类的使用:
Constructor类:它表示的是java类的一个构造方法(以String类为例)
得到某个类的所有的构造方法:
Constructor [ ] conts=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
Constructor cont=Class.forName("java.lang.String").getConstructora(StringBuffer.class);
通过反射来实例化一个对象并调用它的一个方法:
String str=(String)cont.newInstace(new StringBuffer("abc");
char c=str.charAt(2);
Field类:代表某个类中的一个成员变量
先定义一个类
class Demo
{
private int x;
public int y;
Demo(int x,int y)
{
this.x=x;
this.y=y;
}
}
class RflectDemo
{
public static void main(String[]args)
{
Demo pt1=new Demo(3,5);
Field fy=pt1.getClass().getField("y");
System.out.println(fy.get(pt1));
Field fx=pt1.getClass().getDeclavedField("x");
fx.setAccessible(true);
System.out.println(fx.get(pt1));
}
}
Method类:代表某个类中的一个成员方法
Mothod charAt=Class.forName("java.lang.String").getMethod("charAt",int.class);char c=charAt.invoke(str,1);
反射的作用:实现框架的功能
class Person //这个类要在集合中存储{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
}
写一个配置文件,名称为config.properties 内容为:className=java.util.ArrayList
class KuangJiaDemo
{
public static void main(String[]args)
{
InputStream ips=new FileInputStream("config.properties");
Properties prop=new Properties();
prop.load(ips);
ips.close();
String className=prop.getProperty("className");
Collection collecttion=(Collection)Class.forName(className).newInstance();
Person p1=new Person("lisi1",34)
Person p2=new Person("lisi2",3)
Person p3=new Person("lisi3",37)
Person p4=new Person("lisi4",44)
Person p5=new Person("lisi5",24)
collection.add(p1);
collection.add(p2);
collection.add(p3);
collection.add(p4);
collection.add(p5);
System.out.println(collection.size());
}
}
------- android培训、java培训、期待与您交流! ----------
- 黑马程序员——Java中的反射
- 黑马程序员——java中的反射
- 黑马程序员——java中的反射
- 黑马程序员——java中的反射
- 黑马程序员—Java中的反射机制
- 黑马程序员—Java 反射
- 黑马程序员—Java反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员—反射
- 黑马程序员——java中的枚举和反射初探
- 黑马程序员——java中的反射技术再探
- 黑马程序员——java中的反射机制
- 这个图是哪个软件上的噻?
- 读书笔记:Django 模板开发(二)Views, URLs, and Generic Views
- Mac OS X下的截屏功能和使用技巧
- ClassLoader类加载器
- wsdl2java.bat详细使用指南
- 黑马程序员——————java中的反射
- SQL 图书馆
- 使用ATL编写一个简单的COM服务器
- 最开始.net ajax
- windows程序设置中的#pragma语句
- C++11之“move”语意
- 关于java线程池<二>
- 写刚刚好的代码
- 【每日最爱一句】2013.06.08