这是什么啊

java反射基础

反射~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
java开发:
1.XXX.java...
 属性:类 Field
 方法:类 Method
 构造:类 Constructor<T>
2.XXX.class
反射:
万事万物皆对象
字节码文件:Class类:jdk
Person.java--->Person.class
1.如何获取Class类的对象
方法一:通过对象获取Class类
Class类:
 对象.getClass();
方法二:通过Class.forName()
 Class.forName("包名.类名");-->Class
方法三:类名.class
 Person.class--->Class
Method类:用于描述方法的对象
 类中的每一个方法,其实也有对象和它对应。
Constructor类:用于描述构造函数的对象
 类中构造方法所对应的对象。
 newInstance()
Field类:用于描述属性的对象
 类中有属性--->
public class Demo01_Reflect {
 public static void main(String[] args) {
  // 获取Class类的对象,方法一
  Person p1 = new Person();
  Class c1 = p1.getClass();// Person.class
  System.out.println(c1);
  // 方法二:通过包名.类名的方式获取Class类的对象
  try {
   Class c2 = Class.forName("com.qianfeng.reflect.Person");
   System.out.println(c2);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
  // 方法三:通过类名.class直接获取
  Class c3 = Person.class;
  System.out.println(c3);
 }
}
public class Demo02_Reflect_Method {
 public static void main(String[] args) throws Exception {
  // 获取Person类的方法有哪些
  Class c1 = Person.class;
  Method[] methods = c1.getMethods();// 获取Person类中的所有方法,包含继承来的
  for (int i = 0; i < methods.length; i++) {
   System.out.println(methods[i]);
  }
  System.out.println("-------------华丽丽的------------------");
  Method[] methods2 = c1.getDeclaredMethods();
  for (Method m : methods2) {
   System.out.println("-->" + m);
  }
  // 练习1:获取String类所有的方法
  Class c2 = Class.forName("java.lang.String");
  Method[] methods3 = c2.getDeclaredMethods();
  for (Method m : methods3) {
   System.out.println("==>>" + m);
  }
 }
}
package com.qianfeng.reflect;
import java.lang.reflect.Method;
public class Demo03_Reflect_Method {
 public static void main(String[] args) throws Exception {
  Class c1 = Person.class;
  Method[] methods = c1.getDeclaredMethods();
  for (int i = 0; i < methods.length; i++) {
   System.out.println(methods[i]);
  }
  // methods[1]
  // Method getMethod(String name, Class<?>... parameterTypes)
  /**
   * 该方法是用于获取指定的方法:
   *
   * 第一个参数:Stirng methodName:方法名字
   *
   * 第二个参数:Class...:可变参数,传入参数的类型:Class
   */
  Method m1 = c1.getMethod("fun1");
  Method m3 = c1.getMethod("fun3", String.class, int.class);
  Method m4 = c1.getMethod("fun4", String.class, String.class);
  // 执行m1,或者m2
  // Person p1=new Person();
  // 获取Person类的对象
  Person p2 = (Person) c1.newInstance();// 通过c1获取该类的对象
  // Object invoke(Object obj, Object... args)
  // 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
  /**
   * invoke执行方法:
   *
   * 谁调用:Method类的对象
   *
   * 第一个参数:Object obj:执行该方法的对象
   *
   * 第二个参数:Object ...:实参
   *
   * 返回值:该方法执行后的返回的结果
   */
  m1.invoke(p2);
  m3.invoke(p2, "张三", 30);
  String result = (String) m4.invoke(p2, "二狗", "翠花,在一起");
  System.out.println("我得到结果啦:" + result);
 }
}
import java.lang.reflect.Constructor;
public class Demo04_Reflect_Constructor {
 public static void main(String[] args) throws Exception {
  Class c1 = Person.class;
  Constructor[] constructors = c1.getConstructors();
  for (int i = 0; i < constructors.length; i++) {
   System.out.println(constructors[i]);
  }
  Constructor cc1 = c1.getConstructor(String.class, int.class);
  Person p = (Person) cc1.newInstance("张三", 30);// Constructor类的newInstance()
  Person p2 = (Person) c1.newInstance();// Class类的newInstance()
 }
}
public class Demo05_Reflect_Filed {
 public static void main(String[] args) throws Exception {
  Class c1 = Person.class;
  Field[] fields = c1.getDeclaredFields();
  for (Field f : fields) {
   System.out.println(f);
  }
  Field fieldName = c1.getDeclaredField("name");
  Field fieldAge = c1.getDeclaredField("age");
  Person p1 = (Person) c1.newInstance();
  // void set(Object obj, Object value)
  // 打开访问权限:private
  fieldName.setAccessible(true);
  fieldAge.setAccessible(true);
  // 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
  fieldName.set(p1, "二狗");
  fieldAge.set(p1, 18);
  System.out.println(p1.getName() + "\t" + p1.getAge());
 }
}
posted @ 2015-12-03 21:58  陈旭缘  阅读(147)  评论(0)    收藏  举报
这是什么