疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java reflect反射总结


 

 
--------------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();
}
}
}