反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改其本身状态或行为的一种能力。
在Java环境中,反射机制允许程序在执行时获取某个类自身的定义信息,例如熟悉和方法等也可以实现动态创建
类的对象、变更属性的内容或执行特定的方法的功能。从而使Java具有动态语言的特性,增强了程序的灵活性和
可移植性。
2.反射机制的作用
Java反射机制主要用于实现以下功能。
(1)在运行时判断任意一个对象所属的类型。
(2)在运行时构造任意一个类的对象。
(3)在运行时判断任意一个类所具有的成员变量和方法。
(4)在运行时调用任意一个对象的方法,甚至可以调用private方法。
注意:上述功能都是在运行时环境中,而不是在编译时环境中。
3.Java反射机制API
实现Java反射机制的API在Java.lang.reflect包下,具有以下几点。
(1)Class类:代表一个类。
(2)Filed类:代表类的成员变量。
(3)Method类:代表类的方法。
(4)Constructor类:代表类的构造方法。
(5)Array类:提供了动态创建数组及访问数组元素的静态方法。该类中的所有方法都是静态的。
4.应用示例
(1)根据类名获取类中定义的所有属性和方法,实例代码如下:
[java] view plain copy
package day0105
import java.lang.reflect.Array
import java.lang.reflect.Field
import java.lang.reflect.Method
public class Reflect {
/**
*
*打印出String类所有的属性和方法
*/
public void test1(){
Class c = String.class
Method[] methods = c.getMethods()
for(int i = 0i<methods.lengthi++){
System.out.println(methods[i].getName())
}
Field[] fields = c.getFields()
for(Field f : fields){
System.out.println(f.getType()+":"+f.getName())
}
}
/**
* 根据类名动态创建类的对象
* @throws Exception
*/
public void test2() throws Exception{
Class c = Class.forName("day0105.Student")
Student student = (Student)c.newInstance()
student.setName("java")
student.setId("1001")
student.show()
}
/**
* 根据类名和方法名,执行对象的方法
* @param student
* @param method
* @param value
* @throws Exception
*/
public void test3(Student student,String method,String value) throws Exception{
String s1 = method.substring(0,1).toUpperCase()
String s2 = method.substring(1)
String m = "set"+s1+s2
System.out.println(m)
Class c = student.getClass()
Method set = c.getMethod(m,new Class[]{String.class})
set.invoke(student,new Object[]{value})
}
/**
* 动态创建数组对象,对数组元素复制和取值
*/
public void test4(){
try{
Class cls = Class.forName("java.lang.String")
//创建一个String类型的数组,大小为10
Object arr = Array.newInstance(cls, 10)
//在数组5索引的位置赋值
Array.set(arr, 5, "this is a test")
//获取数组5索引位置的值
String s = (String)Array.get(arr, 5)
System.out.println(s)
}catch(Throwable e){
System.out.println(e)
}
}
}
Student类的定义如下
[java] view plain copy
package day0105
public class Student {
private String id
private String name
public String getId() {
return id
}
public void setId(String id) {
this.id = id
}
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
public void show(){
System.out.println(id+":"+name)
}
}
Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象,
无需提前硬编码目标类。这些特性使得反射特别适用于创建以普通方式与对象协作的库。
反射在性能方面会有一定的损耗,用于字段和方法接入时反射要远慢于直接写代码。如果它作为程序
运行中相对很少涉及的部分将不会造成影响,因为即使测试最坏情况下的计时图显示的反射操作也只耗用几微秒。
JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。
Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。
扩展资料:
JAVA中反射实例:
1、Class superClass=clazz.getSuperclass()//获取父类。
System.out.println("getSuperclass:"+superClass)。
2、Class[] interfaces=clazz.getInterfaces()//获取实现接口。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors()//构造方法。
System.out.println("getConstructors:"+cons.length)。
参考资料来源:百度百科: JAVA反射机制