之前写过一篇Java反射的博客,发现有的地方错了,所以删了那篇,重新写mark一下,以便以后复习,东西很久没用就容易忘记。
1.主要类:Class,Constructor,Method,Field。现在的pojo类一般会把属性声明成private所以Field也不怎么用,一般通过截取Method来获取属性
2.每个类、类的实例都可以理解成Class的实例,甚至Class可以看成它自己本身的实例***
3.Class类中以getDeclared开头的,一般只能获取自己声明的
Class.getFields(...)//获取public修饰的属性(包括父类声明的public属性)
Class.getDeclaredFields(...)//获取自己声明的属性(包括private修饰的)
Class.getMethods(...)//获取public修饰的方法(包括父类声明的public方法)
Class.getDeclaredMethods(...)//获取自己声明的方法(包括private修饰的)
4.eg:通过反射复制对象,
public class TestClass {
public static void main(String[] args) throws Exception
{
Person p = new Person(1, "root", 12, "430981", "test@163.com", "12312312312");
System.out.println(p);
Person pCopy = (Person) new TestClass().copy(p);
System.out.println(pCopy);
}
//复制方法,拷贝属性
public Object copy(Object obj) throws Exception
{
//1.获取obj类型
Class<?> classType = obj.getClass();
//2.调用无参构造器
Object objCopy = classType.getConstructor(null).newInstance(null);
/*
* 3.给所有属性赋值,pojo类属性一般为private的,
* classType.getDeclaredFields();只能获取自己声明的属性(包含private修饰的)
* classType.getFields();只能获取public修饰的属性(包含父类的)
* 所有一般通过截取method来获取属性
*/
Method[] methods = classType.getMethods();
for (Method method : methods)
{
String mname = method.getName();//方法名
Class<?> returnType = method.getReturnType();//方法返回类型
String fname =null;
if (mname.startsWith("get") //get开头的方法
&& !mname.equals("getClass")//排除getclass方法
&& !returnType.equals(Void.TYPE))//排除返回值为空的方法
{
fname = mname.substring(3);
} else if (mname.startsWith("is") //
&& (returnType.equals(Boolean.TYPE)//boolean
|| returnType.equals(Boolean.class)))// Boolean
{
fname = mname.substring(2);
}
if(null != fname)
{
//调用get方法获取属性值
Object value = method.invoke(obj, null);
//利用set方法给属性赋值
Method setMethod = classType.getMethod("set"+fname, returnType);
setMethod.invoke(objCopy, value);
}
}
return objCopy;
}
}
返回结果:
{id=1;name=root;age=12;sex=女;identity=123;email=test@163.com;phone=021-1234567;address=[中国-上海省-上海市-紫薇路1弄1号]}
{id=1;name=root;age=12;sex=女;identity=123;email=test@163.com;phone=021-1234567;address=[中国-上海省-上海市-紫薇路1弄1号]}
其中person类如下:Animal是一个基类,person继承Animal,并带有Address属性。
public class Animal {
private int id;//唯一编号
private String name;//名称
private boolean sex;//性别
private int age;//年纪
public Animal() {
}
public Animal(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public boolean isSex()
{
return sex;
}
public void setSex(boolean sex)
{
this.sex = sex;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@Override
public String toString()
{
return "[id="+id+";name="+name+";age="+age+";sex=(sex==true?"男":"女")+"]";
}
}
public class Person extends Animal{
private String identity;
private String email;
private String phone;
private Address address;
public Person() {
}
public Person(int id,String name,int age,String identity, String email, String phone) {
super(id,name,age);
this.identity = identity;
this.email = email;
this.phone = phone;
this.address = new Address("1弄1号");
}
public String getIdentity()
{
return identity;
}
public void setIdentity(String identity)
{
this.identity = identity;
}
public String getEmail()
{
return email;
}
public void setEmail(String email)
{
this.email = email;
}
public String getPhone()
{
return phone;
}
public void setPhone(String phone)
{
this.phone = phone;
}
public Address getAddress()
{
return address;
}
public void setAddress(Address address)
{
this.address = address;
}
@Override
public String toString()
{
return "{id="+getId()+";name="+getName()+";age="+getAge()
+";sex="+(isSex()==true?"男":"女")
+";identity="+identity+";email="+email+";phone="+phone
+";address="+address+"}";
}
}
class Address{
private String country;//国家
private String province;//省份
private String city;//城市
private String street;//街道
private String local;//详细地方
public Address() {
}
public Address(String local) {
this.country = "中国";
this.province = "上海";
this.city = "上海";
this.street = "紫薇路";
this.local = local;
}
public String getCountry()
{
return country;
}
public void setCountry(String country)
{
this.country = country;
}
public String getProvince()
{
return province;
}
public void setProvince(String province)
{
this.province = province;
}
public String getCity()
{
return city;
}
public void setCity(String city)
{
this.city = city;
}
public String getStreet()
{
return street;
}
public void setStreet(String street)
{
this.street = street;
}
public String getLocal()
{
return local;
}
public void setLocal(String local)
{
this.local = local;
}
@Override
public String toString()
{
return "["+country+"-"+province+"省-"+city+"市-"+street+local+"]";
}
}
分享到:
相关推荐
java反射 java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射java反射
JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用JAVA 反射机制应用
java反射,获取所有属性、方法以及List集合类
java反射java反射java反射java反射java反射
Java反射
代码为JAVA反射的一个DEMO,适合初学者临摹学习,还附有properties的创建方法,比较基础。
1.通过Java反射机制获取JavaBean对象。 2.通过JavaBean全路径字符串获取JavaBean对象。 3.获取JavaBean注解信息
Java反射经典实例 Java反射经典实例 Java反射经典实例 Java反射经典实例
这是一本关于Java反射机制论文集合的书。其中包含基本的理论及各种实例。... 关键字有:Java Java反射机制 Java反射 Java反射理论 Java反射实例 Java反射例子 反射原理 反射 网络论文 集合 汇总 总结 Class。
在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...
反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc反射实例-JAVA反射机制.doc...
java 反射 调用私有方法(有参数私有方法)获取私有属性值
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
java 反射demo
java反射获取所有属性,获取所有get方法,包括子类父类,以及包括List集合类
java 反射中操作数组 java 反射中操作数组 java 反射中操作数组
Java 反射机制、Java 的类反射机制、Java 反射机制的学习、Java 反射Reflection--运行时生成实例 java反射机制的手册文档
java反射理论及实现
java反射机制原理和反射机制总结!!! java反射机制原理和反射机制总结!!!