现在的位置: 首页 > 综合 > 正文

java reflect反射总结

2018年01月31日 ⁄ 综合 ⁄ 共 3577字 ⁄ 字号 评论关闭
--------------TestBean
package lh.demo.bean;
public class TestBean {
 private String userName;
 private String password;
 private String age;
 public TestBean (){
 }
 public TestBean (String _userName,String _password,String _age){
  this.userName = _userName;
  this.password = _password;
  this.age = _age;
 }
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getAge() {
  return age;
 }
 public void setAge(String age) {
  this.age = age;
 }
 public void print(String str){
  System.out.println("不是static : "+str);
 }
 private void privateprint(String str){
  System.out.println("private : "+str);
 }
 
 public static void staticprint(String str){
  System.out.println("static : "+str);
 }
 public String toString(){
  System.out.println(this.userName+","+this.password+","+this.age);
  return this.userName+","+this.password+","+this.age;
 } 
--------------------------------
package lh.demo.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import lh.demo.bean.TestBean;
public class Reflect {
// 1如何得到各个字节码对应的实例对象?
// 1)Class.forName("类的全路径") 推荐
// Class<?> bean = Class.forName("lh.demo.bean.TestBean");
// 2)对象.getClass()
// Class<?> bean = new TestBean().getClass();
// 3)类名.class
// Class<?> bean = lh.demo.bean.TestBean.class;
 
// 2创建实例对象:
// 通常方式: TestBean bean = new TestBean("lisi","111","22");
// 反射方式:
// 1)已知类名
// TestBean testBean = (TestBean)bean.newInstance();
// 2)未知类名
// Object object = bean.newInstance();
 
// 3.Constructor类(java.lang.reflect)
// 代表类中的构造方法
//
// 1)得到某个类的构造方法:
// Class类的实例.getConstructors()
// Class<?> bean = Class.forName("lh.demo.bean.TestBean");
// Constructor[] con = bean.getConstructors();
// Object o1 = con[0].newInstance();
// Method method1 = bean.getMethod("toString",null);
// method1.invoke(o1, null);
// Object o2 = con[1].newInstance("lisi","111","22");
// Method method2 = bean.getMethod("toString",null);
// method2.invoke(o2, null);
 
// Class类的实例.getConstructor(Class... parmTypes)
// Class<?> bean = Class.forName("lh.demo.bean.TestBean");
// Constructor con = bean.getConstructor(String.class,String.class,String.class);
// Object b = con.newInstance("aaa","111","22");
 
// Class类的实例.getDeclaredConstructor(Class... parmTypes)
// 私有
 
// 4.Field类(java.lang.reflect)
// 代表类中的成员变量
// 1)得到某个类的成员变量:
// Class类的实例.getDeclaredFields()
// Class<?> bean = Class.forName("lh.demo.bean.TestBean");
// Object o = bean.newInstance();
// Field[] fields = bean.getDeclaredFields();
// for(Field f:fields){
// System.out.println(f.getName());
// }
// Class类的实例.getFields()
// Class类的实例.getDeclaredField(变量名)
// Class<?> bean = Class.forName("lh.demo.bean.TestBean");
// Object o = bean.newInstance();
// Field age = bean.getDeclaredField("age");
// age.setAccessible(true);
// age.set(o,"23");
// System.out.println(age.get(o));
// Class类的实例.getField(变量名)
 
// 5.Method类
// 代表类中的成员方法
// 1)得到某个类的成员方法:
// Class类的实例.getDeclaredMethods()
// 得到本类的所有方法(public,protected,private)继承的,不包括子类的
// Class类的实例.getMethods()
// 得到所有的方法包括子类的,父类的(public)
// Class类的实例.getDeclaredMethod(方法名,Class... 参数类型)
// Method method = bean.getDeclaredMethod("privateprint", String.class);
// method.setAccessible(true); //私有方法
 
// Class类的实例.getMethod(方法名,Class... 参数类型)
// Method method = bean.getMethod("print", String.class);
// 区别:
// public Method[] getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。
// public Method[] getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。
// 2)方法调用:
// 反射的方式:method.invoke(对象,Object... 参数值);
// //非静态调用方法
// Object o3 = method.invoke(null,"aaa");
// //静态
// Object o2 = method.invoke(obj,"aaa");
 
 public static void main(String[] args) {
  try {
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

抱歉!评论已关闭.