/*
java程序员反射
*/
反射概述
Java中的类主要是描述相同特性的一类事物,比如我们用Person类来描述人的共有特性,那么Class这个类就是用来描述Java中的各个类,它主要描述Java类中所包含类所具有的共性,比如说类的名称,所属的基类,所属的包等,比如String,Integer,int,等,我们在实例化对象时,首先是将已经编译的类的字节码文件从硬盘加载到内存中,然后虚拟机用这一份字节码创建多个实例对象,而类的这份字节码文件就用Class的实例对象表示(字节码对象);
/*
*获取一个对象所对应的字节码实例对象有三种方式
1类名.class(),比如int.class
2对象.getClass(),比如person.getClass();
3Class.forName(类名),这个类名必须是所对应具体的包中的具体对象。比如Class.forName("java.util.ArrayList");
返回的方式有两种:
1种是已经被加载过,呆在虚拟机中,直接返回。
2中是还没有被加载到内存中,那么就会被类加载器加载进内存,缓存到虚拟机中,然后再返回。
九个预定义的Class实例对象
八个基本数据类型,加上一个返回类型void.class。
演示代码如下:
- class ReflectDemo1_1
- {
- public static void main(String[] args) throws ClassNotFoundException
- {
- Person p=new Person("xt",12);
- Class c1=Integer.class;
- Class c2=p.getClass();
- Class c3=int.class;
- System.out.println(Class.forName("java.lang.Integer"));
- String s1="xtiongtao";
- System.out.println(s1.getClass());
- System.out.println(c1);
- System.out.println(c2);
- System.out.println(c3);
-
- System.out.println(int.class.isPrimitive());
- System.out.println(Integer.class.isPrimitive());
- System.out.println(int.class==Integer.TYPE);
- System.out.println(int[].class.isArray())
- System.out.println("******************************");
- fun();
- }
-
- public static void fun()throws ClassNotFoundException
- {
-
-
- String s1="xt";
- Class c1=s1.getClass();
- Class c2=String.class;
- Class c3=Class.forName("java.lang.String");
- System.out.println(c1==c2);
- System.out.println(c2==c3);
-
-
- }
- }
- class Person
- {
- private String name;
- private int age;
- Person(String name,int age)
- {
- this.name=name;
- this.age=age;
- }
- }
反射的定义:反射就是将Java类中的每一中成分映射成对应的Java类。比如Person中的有成员变量,成员函数,构造函数等成分,而Class类中定义了一些方法来描述这些成分,Method, Contructor,Field,Package等Constructor表示一份字节码中的构造方法。程序在编译时,只检查语法错误,不会去进行运算。构造函数的反射
演示代码如下:
- import java.lang.reflect.*;
- class ReflectDemo1_2
- {
- public static void main(String[] args) throws Exception
- {
-
- Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuilder.class);
-
- String s=(String)constructor.newInstance(new StringBuilder("xiongtao"));
- System.out.println(s.charAt(2));
-
-
- String s1=(String)Class.forName("java.lang.String").newInstance();
- s1="xiongtao";
- System.out.println(s1.charAt(2));
-
-
- }
- }
- class Person
- {
- private String name;
- private int age;
- Person(String name,int age)
- {
- this.name=name;
- this.age=age;
- }
- public void showMsg()
- {
- System.out.println(name+"……"+age);
- }
- }
成员变量的反射- <span style="font-size:10px;">import java.lang.reflect.*;
- class ReflectDemo1_4
- {
- public static void main(String[] args) throws Exception
- {
- TextClass tc=new TextClass();
- letterReplace(tc);
- }
- public static void letterReplace(Object obj)throws Exception
- {
- Field[] fields=obj.getClass().getDeclaredFields();
- for(Field field :fields)
- {
- if(field.getType()==String.class)
- {
- String s=(String)field.get(obj);
- String temp=s.replace('b','a');
- field.set(obj,temp);
- }
- }
- System.out.println(obj);
- }
- }
- class TextClass
- {
- String str1="bball";
- String str2="basketball";
- String str3="itcast";
- public String toString()
- {
- return str1+"\n"+str2+"\n"+str3;
- }
- }</span>
成员方法的反射演示代码如下:
-
-
-
-
- import java.lang.reflect.*;
- class ReflectDemo1_6
- {
- public static void main(String[] args) throws Exception
- {
- String s="xiongtao";
- methodFun(s);
- }
- public static void methodFun(String s)throws Exception
- {
- Method m=Class.forName("java.lang.String").getMethod("charAt",int.class);
-
- System.out.println(m.invoke(s,2));
- }
- }
在实际开发时,我们往往会接受其它的开发人员传来的一个类名,然后我们根据类名调用这个类名的主函数,这时我们就就需要方法的反射来完成这个功能。演示代码如下:
- import java.lang.reflect.*;
- class ReflectDemo1_7
- {
- public static void main(String[] args)throws Exception
- {
-
-
-
-
-
- String clsName=args[0];
-
- Method m=Class.forName(clsName).getMethod("main",String[].class);
-
-
-
- m.invoke(null,(Object)new String[]{"xt","ctt","non"});
- m.invoke(null,new Object[]{(new String[]{"xt","ctt","non"})});
- }
- }
- class TextDemo1_1
- {
- public static void main(String[]args)
- {
- for(String arg:args)
- {
- System.out.println(arg);
- }
- }
- }
接下来,我们将使用一个方法。如果传入的是一个数组,那么就将数组中的每个元素都打印出来,如果是一个单个元素,那么就直接将这个元素打印出来.演示实例如下:
-
-
-
- import java.lang.reflect.*;
- class ReflectDemo1_9
- {
- public static void main(String[] args)
- {
- int[] arr=new int[]{1,23,4,5};
- String s="xiongtao";
- printFun(arr);
- printFun(s);
-
- }
- public static void printFun(Object obj)
- {
-
- if(obj.getClass().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);
- }
- }
- }
接下来我们来看一段实例:- import java.util.*;
- class ReflectDemo1_10
- {
- public static void main(String[] args)
- {
- Person p1=new Person("xt",12);
- Person p2=new Person("ctt",12);
- Person p3=new Person("ctt",12);
- Person p4=new Person("xt",12);
- Collection c=new ArrayList();
- c.add(p1);
- c.add(p2);
- c.add(p3);
- c.add(p4);
- System.out.println(c.size());
- RerefPoint p5=new RerefPoint(1,2);
- RerefPoint p6=new RerefPoint(3,4);
- Collection s=new HashSet();
- s.add(p5);
- s.add(p6);
- System.out.println(s.size());
- p5.x=4;
- s.remove(p5);
- System.out.println(s.size());
-
-
- }
- }
- class RerefPoint
- {
- public int x;
- public int y;
- RerefPoint(int x,int y)
- {
- this.x=x;
- this.y=y;
- }
- public int hashCode()
- {
- int prim=31;
- return prim*x+y;
- }