Java的反射技术(Class类,Constructor类,Method类,Field类)
Java编码时知道类和对象的具体信息,此时直接对类和对象进⾏操作即可,⽆需反射 如果编码时不知道类或者对象的具体信息,此时应该使⽤反射来实现
为什么要使⽤反射
1. 反射就是把Java类中的各种成分映射成⼀个个的java对象。例如,⼀个类有:成员变量,⽅法,构造⽅法,包等等信息,利⽤反射技
术可以对⼀个类进⾏解剖,把各个组成部分映射成⼀个个对象。
反射技术常见于框架中。
⽐如类的名称放在XML⽂件中,属性和属性值放在XML⽂件中,需要在运⾏时读取XML⽂件,动态获取类的信息。
在编译时根本⽆法知道该对象或类可能属于哪些类,程序只依靠运⾏时信息来发现该对象和类的真实信息。
反射的作⽤:创建对象、操作属性、调⽤⽅法
如何使⽤反射
掌握反射技术的要点在于:如何从⼀个class中反射出各个组成部分。反射出来的对象怎么⽤。
Class类
Class类:代表⼀个类,是Java反射机制的起源和⼊⼝,⽤于获取与类相关的各种信息
提供了获取类信息的相关⽅法(Class类继承⾃Object类)
Class类是所有类的共同的图纸
每个类有⾃⼰的对象,同时每个类也看做是⼀个对象,有共同的图纸Class,存放类的结构信息,能够通过相应⽅法取出相应的信息:类的名字、属性、⽅法、构造⽅法、⽗类和接⼝。
总之,只要是在源程序中出现的类型,都有各⾃的Class实例对象,例如,int,void…
反射就是把Java类中的各种成分映射成⼀个个的java对象。例如,⼀个类有:成员变量,⽅法,构造⽅法,包等等信息,利⽤反射技术可以对⼀个类进⾏解剖,把各个组成部分映射成⼀个个对象。
那么,既然反射的作⽤是创建对象、操作属性、调⽤⽅法,要实现以上3个作⽤,需要⽤到下⾯介绍的
3个类:Constructor类,Method 类, Field类
Constructor类
(1)Constructor类代表某个类中的⼀个构造⽅法
得到某个类所有的构造⽅法:
例⼦:
Constructor [] constructors= Class.forName("java.lang.String").getConstructors();
得到某⼀个构造⽅法:
例⼦: //获得⽅法时要⽤到类型
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
(2)创建实例对象:
通常⽅式:
String str =new String(new StringBuffer("abc"));
反射⽅式:
String str =(wInstance(new StringBuffer("abc"));
例⼦:
String obj =(String)Class.forName("java.lang.String").newInstance();
该⽅法内部先得到默认的构造⽅法,然后⽤该构造⽅法创建实例对象。
Method类
Method类代表某个类中的⼀个成员⽅法
得到类中的某⼀个⽅法——
例⼦:
Method charAt = Class.forName("java.lang.String").getMethod("charAt",int.class);
调⽤⽅法——
通常⽅式:
System.out.println(str.charAt(1));
反射⽅式:
System.out.println(charAt.invoke(str,1));
如果传递给Method对象的invoke()⽅法的第⼀个参数为null,这有着什么样的意义呢?说明该Method对象对应的是⼀个静态⽅法!
jdk1.4和jdk1.5的invoke⽅法的区别:
Jdk1.5:public Object invoke(Object obj,Object… args)
Jdk1.4:public Object invoke(Object obj,Object[] args),即按jdk1.4的语法,需要将⼀个数组作为参数传递给invoke⽅法时,数组中的每个元素分别对应被调⽤⽅法中的⼀个参数,所以,调⽤charAt⽅
法的代码也可以⽤Jdk1.4改写为 charAt.invoke(“str”, new Object[]{1})形式。
Field类
Field类代表某个类中的⼀个成员变量
问题:得到的Field对象是对应到类上⾯的成员变量,还是对应到对象上的成员变量?类只有⼀个,⽽该类的实例对象有多个,如果是与对象关联,哪关联的是哪个对象呢?所以字段fieldX 代表的是x的定义,⽽不是具体的x变量。(注意访问权限的问题)
⽰例代码:
ReflectPoint point =new ReflectPoint(1,7);
Field y = Class.forName("java.ReflectPoint").getField("y");
System.out.(point));
//Field x = Class.forName("java.ReflectPoint").getField("x");
Field x = Class.forName("java.ReflectPoint").getDeclaredField("x");
x.setAccessible(true);
System.out.(point));
实例演⽰
⾸先,我们⾃定义⼀个Person类,它是我们将要进⾏反射的⽬标。.
在这个类⾥⾯,我们定义了:
1.构造⽅法
2.实例⽅法
3.属性
package flect;
import java.io.InputStream;
import java.util.List;
public class Person {
public String name ="yaoer";
private int password =123;
private static int age =23;
public Person(){
System.out.println("person");
}
public Person(String name){
System.out.println(name);
}
public Person(String name,int password){
System.out.println(name +":"+ password);
}
private Person(List list){
System.out.println("list");
}
public void aa1(){
System.out.println("aaa1");
}
public void aa1(String name,int password){
System.out.println(name +":"+ password);
}
public String aa1(String name,int[] password){
return new String("adad");
}
private void aa1(InputStream in){
System.out.println(in);
}
public static void aa1(int num){
System.out.println(num);
}
public static void main(String[] args){
System.out.println("main!");
}
}
反射:类的构造函数,创建类的对象package flect;
import flect.Constructor;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
//解剖(反射)类的构造函数,创建类的对象
public class Demo2 {
// 1——反射构造函数:public Person()
@Test
public void test1()throws Exception {
Class<?> clazz = Class.forName("flect.Person");
Constructor<?> c = Constructor(null);
Person p =(Person) c.newInstance(null);
System.out.println(p.name);
}
// 2——反射构造函数:public Person(String name)
@Test
public void test2()throws Exception {
Class<?> clazz = Class.forName("flect.Person");
Constructor<?> c = Constructor(String.class);
Person p =(Person) c.newInstance("xxxooo");
System.out.println(p.name);
}
// 3——反射构造函数:public Person(String name,int password)@Test
public void test3()throws Exception {
Class<?> clazz = Class.forName("flect.Person");
Constructor<?> c = Constructor(String.class,int.class);
Person p =(Person) c.newInstance("xxxooo",20);
System.out.println(p.name);
}
// 4——反射构造函数:private Person(List list)
@Test
public void test4()throws Exception {
Class<?> clazz = Class.forName("flect.Person");
Constructor<?> c = DeclaredConstructor(List.class);
c.setAccessible(true);//暴⼒反射
Person p =(Person) c.newInstance(new ArrayList());
System.out.println(p.name);
}
@Test
public void test5()throws Exception {
Class<?> clazz = Class.forName("flect.Person");
Person p =(Person) wInstance();
}
}
反射:类中的⽅法
/**
*
*/
package flect;
import java.io.FileInputStream;
import java.io.InputStream;
import flect.Method;
import org.junit.Test;
/**
* 反射类中的⽅法
*
*/
public class Demo3 {
// 反射类的⽅法: public void aa1(){
@Test
public void test1()throws Exception {
Class clazz = Class.forName("flect.Person");
Method method = Method("aa1", null);
Object obj = wInstance();
method.invoke(obj, null);
}
// 反射类的⽅法: public void aa1(String name,int password){
@Test
public void test2()throws Exception {
Class clazz = Class.forName("flect.Person");
Method method = Method("aa1", String.class,int.class);
Object obj = wInstance();
method.invoke(obj,"yaoer",24);
}
/
/ 反射类的⽅法: public void aa1(String name,int[] password){
@Test
public void test3()throws Exception {
Class clazz = Class.forName("flect.Person");
Method method = Method("aa1", String.class,int[].class);
int[] a =new int[]{1,2,3};
Object obj = wInstance();
System.out.println(method.invoke(obj,"yaoer", a));
java接口有没有构造方法
}
// 反射类的⽅法:private void aa1(InputStream in)
@Test
public void test4()throws Exception {
Class clazz = Class.forName("flect.Person");
Method method = DeclaredMethod("aa1", InputStream.class);// private
method.setAccessible(true);
Object obj = wInstance();
System.out.println(method.invoke(obj,new FileInputStream("c://1.txt")));// 对应⽬录下需要存在此⽂件}
// 反射类的⽅法:public static void aa1(int num) {
@Test
public void test5()throws Exception {
Class clazz = Class.forName("flect.Person");
Object obj = wInstance();
Method m = Method("aa1",int.class);
m.invoke(obj,23);
}
// 反射类的⽅法: public static void main(){
@Test
public void test6()throws Exception {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。