`
Mr.Benny
  • 浏览: 28985 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

【转载】JAVA反射小结

阅读更多
1  JAVA的反射,其实就是通过一个实例化的对象反过来去找到一个类的完整信息,比如对于如下的形式:
X x=new X();
   x.getClass().getName();
这里就会输出这个类所在的完整信息,即"包名.类名";
  最常用的三种实例化CLASS类对象
Class<?> c1 = null ;  // 指定泛型
  Class<?> c2 = null ;  // 指定泛型
  Class<?> c3 = null ;  // 指定泛型
  try{
   // 以下的操作形式是在开发中最常用的一种形式
   c1 = Class.forName("org.lxh.demo15.getclassdemo.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 通过无参构造实例化对象
   假设有个类,其中必须存在一个无参数的构造函数,则可以用如下的这个方式进行
Class<?> c = null ;  // 声明Class对象
  try{
   c = Class.forName("org.lxh.demo15.instancedemo.Person") ;
  }catch(ClassNotFoundException e){
   e.printStackTrace() ;
  }
  Person per = null ; // 声明Person对象
  try{
   per = (Person)c.newInstance() ; // 实例化对象
  }catch(Exception e){
   e.printStackTrace() ;
  }
  如果类中是存在有参数的构造函数的话,则用如下方式实现:
    Class<?> c = null ;  // 声明Class对象
  try{
   c = Class.forName("org.lxh.demo15.getclassdemo.Person") ;
  }catch(ClassNotFoundException e){
   e.printStackTrace() ;
  }
  Person per = null ; // 声明Person对象
  Constructor<?> cons[] = null ;
  cons = c.getConstructors() ;
  try{
   per = (Person)cons[0].newInstance("李兴华",30) ; // 实例化对象
  }catch(Exception e){
   e.printStackTrace() ;
  }
   这里是通过类中的getConsructors()取得本类中的全部构造方法.


3  取得类的结构:
    A 取得类中的全部接口: 
      Class<?> c[] = c1.getInterfaces() ; // 以数组形式返回实现的全部接口
  for(int i=0;i<c.length;i++){
   System.out.println("实现的接口名称:" + c[i].getName()) ; // 输出接口名称
  }
     B 取得父类
          Class<?> c2 = c1.getSuperclass() ; // 取得父类
     C 取得全部的构造方法,并且通过modifier类修饰符来获得
      import java.lang.reflect.Constructor ; // 导入构造方法的包
import java.lang.reflect.Modifier ; // 导入构造方法的包
public class GetConstructorDemo03{
public static void main(String args[]){
  Class<?> c1 = null ;  // 声明Class对象
  try{
   c1 = Class.forName("org.lxh.demo15.Person") ; // 实例化对象
  }catch(ClassNotFoundException e){
   e.printStackTrace() ;
  }
  Constructor<?> con[] = c1.getConstructors() ; // 取得一个类中的全部构造
  for(int i=0;i<con.length;i++){
   Class<?> p[] = con[i].getParameterTypes() ;  // 得到构造方法中的全部

参数
   System.out.print("构造方法:" ) ;  // 输出构造,直接打印
   int mo = con[i].getModifiers() ; // 得到所要的访问权限
   System.out.print(Modifier.toString(mo) + " ") ; // 得到修饰符
   System.out.print(con[i].getName()) ; // 取得构造方法的名字
   System.out.print("(") ;
   for(int j=0;j<p.length;j++){
    System.out.print(p[j].getName() + " arg" + i) ;
    if(j<p.length-1){
     // 判断此是否是最后一个参数
     System.out.print(","); // 输出“,”
    }
   }
   System.out.println("){}") ;
  }
}
}

  D 取得一个类的全部构造方法
     public class GetMethodDemo{
public static void main(String args[]){
  Class<?> c1 = null ;  // 声明Class对象
  try{
   c1 = Class.forName("org.lxh.demo15.Person") ; // 实例化对象
  }catch(ClassNotFoundException e){
   e.printStackTrace() ;
  }
  Method m[] = c1.getMethods() ; // 取得全部方法
  for(int i=0;i<m.length;i++){
   Class<?> 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<p.length;j++){
    System.out.print(p[j].getName() + " " + "arg" + j) ;
    if(j<p.length-1){
     System.out.print(",") ;
    }
   }
   Class<?> ex[] = m[i].getExceptionTypes() ; // 取出异常
   if(ex.length>0){
    System.out.print(") throws ") ;
   }else{
    System.out.print(")") ;
   }
   for(int j=0;j<ex.length;j++){
    System.out.print(ex[j].getName()) ;
    if(j<p.length-1){
     System.out.print(",") ;
    }
   }
   System.out.println() ;
  }
}
}


4  通过反射调用类中的方法
      Class<?> c1 = null ;
  try{
   c1 = Class.forName("org.lxh.demo15.Person") ; // 实例化Class对象
  }catch(Exception e){}
  try{
   Method  met = c1.getMethod("sayChina") ; // 找到sayChina()方法
   met.invoke(c1.newInstance()) ; // 调用方法
  }catch(Exception e){
   e.printStackTrace() ;
  }
}
   如果要调用有参数的
      Class<?> c1 = null ;
  try{
   c1 = Class.forName("org.lxh.demo15.Person") ; // 实例化Class对象
  }catch(Exception e){}
  try{
   Method  met = c1.getMethod("sayHello",String.class,int.class) ; // 找到sayChina

()方法
   String rv = null ;
   rv = (String)met.invoke(c1.newInstance(),"李兴华",30) ; // 调用方法
   System.out.println(rv) ;
  }catch(Exception e){
   e.printStackTrace() ;
  }
}


5 利用反射配合工厂模式
  package org.lxh.demo15.factorydemo02 ;
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","org.lxh.demo15.factorydemo02.Apple") ;
    pro.setProperty("orange","org.lxh.demo15.factorydemo02.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  动态代理:
  import java.lang.reflect.InvocationHandler ;
import java.lang.reflect.Proxy ;
import java.lang.reflect.Method ;
interface Subject{
public String say(String name,int age) ; // 定义抽象方法say
}
class RealSubject implements Subject{ // 实现接口
public String say(String name,int age){
  return "姓名:" + name + ",年龄:" + age ;
}
};
class MyInvocationHandler implements InvocationHandler{
private Object obj ;
public Object bind(Object obj){
  this.obj = obj ; // 真实主题类
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass

().getInterfaces(),this) ;
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
  Object temp = method.invoke(this.obj,args) ; // 调用方法
  return temp ;
}
};
public class DynaProxyDemo{
public static void main(String args[]){
  Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
  String info = sub.say("李兴华",30) ;
  System.out.println(info) ;
}
};
分享到:
评论

相关推荐

    Java反射性能测试分析

    ### Java反射性能测试分析 #### 引言 Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地访问、检测和修改类、接口、字段和方法等对象。然而,反射操作通常会引入额外的开销,这在性能敏感的...

    JAVA反射机制的入门代码

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...

    java反射,获取所有属性、方法以及List集合类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建对象、获取类...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    Java反射经典实例

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等信息,即使这些信息在编译时并未明确知晓。在Java中,反射通常通过`java.lang.Class`类和相关的API来实现。本实例将...

    通过Java反射机制获取JavaBean对象

    1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息

    java反射源代码

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有高度的灵活性,尤其在处理框架、插件系统以及元数据驱动...

    北大青鸟java反射机制

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查并操作类、接口、字段和方法等对象。在"北大青鸟java反射机制"的学习资料中,我们将会深入探讨这一核心特性。 首先,我们要理解反射的核心概念...

    java反射机制源码

    java反射机制源码java反射机制源码java反射机制源码

    Java反射简单例子

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制主要用到了java.lang.Class、java.lang.reflect.Method、java.lang.reflect....

    java反射.ppt

    Java反射是Java编程语言的一个重要特性,它允许在运行时检查和操作类、接口、字段和方法等对象。反射提供了一种动态访问和修改程序的能力,使得代码可以在不知道具体类的情况下,对对象进行操作。 1. **Class类的...

    Java反射机制源码

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改私有成员,这为实现元编程和框架设计...

    Java反射案例

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和Field...

    java 反射工厂模式

    Java反射和工厂模式是两种非常重要的编程概念,它们在软件设计和实现中起着关键作用。反射机制允许我们在运行时动态地获取类的信息并操作对象,而工厂模式是一种设计模式,它提供了一种创建对象的最佳方式,使得代码...

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    "Java反射 JavaBean 对象自动生成插入、更新、删除、查询sql语句操作" Java反射JavaBean对象自动生成插入、更新、删除、查询sql语句操作是指通过Java反射机制,依据提供的表名、POJO类型、数据对象自动生成sql语句...

    java反射技术ppt

    Java反射技术是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象以及它们的方法和属性。通过反射,开发者能够获取关于类的信息,并且能够在运行时动态地创建对象和调用方法,这为编程带来...

    实战java反射机制-让你迅速认识java强大的反射机制

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息,甚至动态地创建对象并调用其方法。通过反射,开发者可以实现高度灵活和动态的代码,这对于框架开发、元编程...

    java反射ppt

    java反射的ppt帮助大家学习java反射

    Java反射机制的详细讲解及实例,有助于java深度开发

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法等对象。这一机制对于理解和利用Java的动态性至关重要,尤其是在进行复杂系统设计、框架开发以及元数据驱动的应用中...

Global site tag (gtag.js) - Google Analytics