JAVA反射技术,在平时我们的开发中虽然很少会用到例如读取配制文件可能就用到这个技术,但在我们所使用的框架源码中是经常会用到的。
1、常用举例:package com.test.instancedemo;class X{};public class GetClassDemo02{ public static void main(String args[]){ Class> c1 = null ; // 指定泛型 Class> c2 = null ; // 指定泛型 Class> c3 = null ; // 指定泛型 try{ // 以下的操作形式是在开发中最常用的一种形式 c1 = Class.forName("com.test.instancedemo.X") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } c2 = new X().getClass() ; // 通过Object类中的方法实例化 c3 = X.class ; // 通过类.class实例化 System.out.println("类名称:" + c1.getName()) ; // 得到类的名称 System.out.println("类名称:" + c2.getName()) ; // 得到类的名称 System.out.println("类名称:" + c3.getName()) ; // 得到类的名称 }};
2、反射如何操作对象:package com.test.instancedemo ;class Person{ private String name ; // name属性 private int age ; // age属性 public void setName(String name){ this.name = name ; } public void setAge(int age){ this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } public String toString(){ // 覆写toString()方法 return "姓名:" + this.name + ",年龄:" + this.age ; }};public class InstanceDemo01{ public static void main(String args[]){ Class> c = null ; // 声明Class对象 try{ c = Class.forName("com.test.instancedemo.Person") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } Person per = null ; // 声明Person对象 try{ per = (Person)c.newInstance() ; // 实例化对象 }catch(Exception e){ e.printStackTrace() ; } per.setName("LXY") ; // 设置姓名 per.setAge(30) ; // 设置年龄 System.out.println(per) ; // 内容输出,调用toString() }};
3、如何使用反射包package com.test.instancedemo.instancedemo ;import java.lang.reflect.Constructor ; // 导入反射机制包class Person{ private String name ; // name属性 private int age ; // age属性 public Person(String name,int age){ this.setName(name) ; this.setAge(age); } public void setName(String name){ this.name = name ; } public void setAge(int age){ this.age = age ; } public String getName(){ return this.name ; } public int getAge(){ return this.age ; } public String toString(){ // 覆写toString()方法 return "姓名:" + this.name + ",年龄:" + this.age ; }};public class InstanceDemo03{ public static void main(String args[]){ Class> c = null ; // 声明Class对象 try{ c = Class.forName("com.test.instancedemo.Person") ; }catch(ClassNotFoundException e){ e.printStackTrace() ; } Person per = null ; // 声明Person对象 Constructor> cons[] = null ; cons = c.getConstructors() ; try{ per = (Person)cons[0].newInstance("LXY",30) ; // 实例化对象 }catch(Exception e){ e.printStackTrace() ; } System.out.println(per) ; // 内容输出,调用toString() }};
4、使用实例1package com.test.instancedemo.factorydemo ;interface Fruit{ public void eat() ; // 吃水果}class Apple implements Fruit{ public void eat(){ // 覆写eat()方法 System.out.println("** 吃苹果"); }};class Orange implements Fruit{ public void eat(){ System.out.println("** 吃橘子") ; }};class Factory{ public static Fruit getInstance(String className){ Fruit fruit = null ; try{ fruit = (Fruit)Class.forName(className).newInstance() ; }catch(Exception e){ e.printStackTrace() ; } return fruit ; }};public class FactoryDemo01{ public static void main(String args[]){ Fruit f = Factory.getInstance("com.test.instancedemo.factorydemo.Apple") ; if(f!=null){ f.eat() ; } }};
4、使用实例2package com.test.instancedemo.factorydemo ;import java.util.Properties ;import java.io.File ;import java.io.FileOutputStream ;import java.io.FileInputStream ;interface Fruit{ public void eat() ; // 吃水果}class Apple implements Fruit{ public void eat(){ // 覆写eat()方法 System.out.println("** 吃苹果"); }};class Orange implements Fruit{ public void eat(){ System.out.println("** 吃橘子") ; }};class Init{ public static Properties getPro(){ Properties pro = new Properties() ; File f = new File("d:\\fruit.properties") ; // 找到属性文件 try{ if(f.exists()){ // 文件存在 pro.load(new FileInputStream(f)) ; // 读取属性 }else{ pro.setProperty("apple"," com.test.instancedemo.factorydemo.Apple") ; pro.setProperty("orange"," com.test.instancedemo.factorydemo.Orange") ; pro.store(new FileOutputStream(f),"FRUIT CLASS") ; } }catch(Exception e){} return pro ; }};class Factory{ public static Fruit getInstance(String className){ Fruit fruit = null ; try{ fruit = (Fruit)Class.forName(className).newInstance() ; }catch(Exception e){ e.printStackTrace() ; } return fruit ; }};public class FactoryDemo02{ public static void main(String args[]){ Properties pro = Init.getPro() ; Fruit f = Factory.getInstance(pro.getProperty("apple")) ; if(f!=null){ f.eat() ; } }};
6、获取一个对象的方法package com.test.instancedemo.factorydemo ;import java.lang.reflect.Method ; // 导入构造方法的包import java.lang.reflect.Modifier ; // 导入构造方法的包public class GetMethodDemo{ public static void main(String args[]){ Class> c1 = null ; // 声明Class对象 try{ c1 = Class.forName("com.test.instancedemo.factorydemo.Person") ; // 实例化对象 }catch(ClassNotFoundException e){ e.printStackTrace() ; } Method m[] = c1.getMethods() ; // 取得全部方法 for(int i=0;i r = m[i].getReturnType() ; // 得到返回值类型 Class> p[] = m[i].getParameterTypes() ; // 取得全部参数的类型 int xx = m[i].getModifiers() ; // 得到修饰符 System.out.print(Modifier.toString(xx) + " ") ; // 输出修饰符 System.out.print(r + " ") ; System.out.print(m[i].getName()) ; System.out.print("(") ; for(int j=0;j ex[] = m[i].getExceptionTypes() ; // 取出异常 if(ex.length>0){ System.out.print(") throws ") ; }else{ System.out.print(")") ; } for(int j=0;j