A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 星辉祝愿 中级黑马   /  2015-6-2 12:13  /  276 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射的用法
1)、需要获得java类的各个组成部分,首先需要获得类的Class对象,获得Class对象的三种方式:
       Class.forName(classname)   用于做类加载
       obj.getClass()                       用于获得对象的类型
       类名.class                         用于获得指定的类型,传参用
2)、反射类的构造函数:
       Constructorcon = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
       con.newInstance(params...)
3)、反射类的成员方法:
       Classclazz = Person.class;
       Methodmethod = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
       method.invoke();
4)、反射类的属性:
       Fieldfield = clazz.getField(fieldName);
       field.setAccessible(true);
       field.setObject(value);

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.*;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Modifier;

  6. public class test1 {

  7.         public static void main(String[] args) throws Exception {
  8.                 mether1();
  9.                 mether2();
  10.                 mether3();
  11.                 mether4();
  12.         }
  13.        
  14.         //获取字节码class
  15.                 public static void mether1() throws Exception{
  16.                         // 1. 根据给定的类名来获得  用于类加载
  17.                         String classname = "javaenhance.Person";// 一般来自配置文件
  18.                         Class c1 = Class.forName(classname);// 此对象代表Person.class

  19.                         // 2. 如果拿到了对象,不知道是什么类型   用于获得对象的类型
  20.                         Object obj = new Person();
  21.                         Class c2 = obj.getClass();// 获得对象具体的类型
  22.                                        
  23.                         // 3. 如果是明确地获得某个类的Class对象  主要用于传参
  24.                         Class c3 = Person.class;       
  25.                                        
  26.                         System.out.println(c1);
  27.                         System.out.println(c2);
  28.                         System.out.println(c3);       
  29.                         System.out.println("获取获取字节码class");
  30.                         System.out.println();
  31.                 }

  32.         //实例化对象
  33.         private static void mether2() throws Exception {
  34.                 Class c = Person.class;
  35.                 Constructor co = c.getDeclaredConstructor();
  36.                 Person p = (Person) co.newInstance();
  37.                
  38.                 Constructor co1 = c.getDeclaredConstructor(String.class,int.class);
  39.                 Person p1 = (Person) co1.newInstance("sharry",11);
  40.                
  41.                 System.out.println(p.toString());
  42.                 System.out.println(p1.toString());
  43.                
  44.                 System.out.println("实例化对象");
  45.                 System.out.println();
  46.         }
  47.        
  48.         //调用成员方法
  49.                 private static void mether3() throws Exception{
  50.                         // TODO 自动生成的方法存根
  51.                         Class c = Person.class;
  52.                         Constructor co1 = c.getDeclaredConstructor(String.class,int.class);
  53.                         Person p1 = (Person) co1.newInstance("sharry",11);
  54.                        
  55.                         System.out.println(p1.toString());
  56.                        
  57.                         Method method = c.getMethod("setName", String.class);
  58.                         method.invoke(p1, "make");
  59.                        
  60.                         System.out.println(p1.toString());
  61.                        
  62.                         System.out.println("调用成员方法");
  63.                         System.out.println();
  64.                 }
  65.                
  66.                 //获取属性
  67.                 private static void mether4(){
  68.                         Class<?> demo = null;
  69.                 try {
  70.                     demo = Person.class;
  71.                 } catch (Exception e) {
  72.                     e.printStackTrace();
  73.                 }
  74.                 // 取得本类的全部属性
  75.                 Field[] field = demo.getDeclaredFields();
  76.                 for (int i = 0; i < field.length; i++) {
  77.                     // 权限修饰符
  78.                     int mo = field[i].getModifiers();
  79.                     String priv = Modifier.toString(mo);
  80.                     // 属性类型
  81.                     Class<?> type = field[i].getType();
  82.                     System.out.println(priv + " " + type.getName() + " "
  83.                             + field[i].getName() + ";");
  84.                 }
  85.                 System.out.println("获取属性");
  86.                         System.out.println();
  87.                 }
  88. }


  89. class Person {
  90.        
  91.         private String name;
  92.         private int age;
  93.        
  94.         public Person() {
  95.         }

  96.         public Person(String name, int age) {
  97.                
  98.                 this.name = name;
  99.                 this.age = age;
  100.         }
  101.        
  102.         public String toString(){
  103.                 return "name:"+name+" age:"+age;
  104.         }
  105.        
  106.         public String sayHello(int age,String name){
  107.                 return "My name is "+name+","+age+"years old ,nice to meet you ";
  108.         }
  109.        
  110.         private void myPrivate(){
  111.                 System.out.println("i am private");
  112.         }
  113.        
  114.         public String getName() {
  115.                 return name;
  116.         }
  117.         public void setName(String name) {
  118.                 this.name = name;
  119.         }
  120.         public int getAge() {
  121.                 return age;
  122.         }
  123.         public void setAge(int age) {
  124.                 this.age = age;
  125.         }
  126.        
  127. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马