java反射机制总结

最近项目中用到java的需要用到java的反射机制,主要用于jdbc数据库的sql语句的封装,现在将java反射机制的一些常用的方法总结如下:

主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类:代表一个类。
Field 类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor 类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。

在java.lang.Object 类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API 中的核心类,它有以下方法
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

下面是具体方法的使用demo:
新建类student
package com.javareflect.model;
public class Student {
     private int id ;
public   String name ;
public   int  number;
private int age ;
private String address;
public Student(){
 
}
public Student(String name ,int number ,int  age ,String address){
 this.name = name ;
 this.number = number;
 this.age = age ;
 this.address = address;
}
@Override
public String toString(){
return "name="+getName()+"  number="+getNumber() + "   age="+getAge()+"  address="+getAddress();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int  getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Student getStudent(int id ){
return new Student("张三",1,34,"广东省揭阳市") ;
}
public Student getStudent(String name ,String address){
return new Student(name,1,34,address) ;

}
用junit新建一个测试类
package com.javareflect.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import org.junit.Test;
import com.javareflect.model.Student;
public class TestStudent {
@SuppressWarnings("rawtypes")
@Test
public void test() {
   Student student = new Student();
   Class<? extends Student> stuClass =  student.getClass();
   //拿到所有的属性
  Field[]  fields = stuClass.getDeclaredFields();
  for (Field field : fields) {
System.out.println("fieldName:"+field.getName());
  }
//--------------------------------------------------------------------------------------  
  //拿到public属性
  Field[]  pulic_fields = stuClass.getFields();
  for (Field field : pulic_fields) {
System.out.println("public_fieldName:"+field.getName());
  }
  //--------------------------------------------------------------------------------------  
 //拿到构造方法
  Constructor[]  construtors = stuClass.getConstructors();
 for(Constructor constructor : construtors){
//  System.out.println("contrutor--Modifiers="+constructor.getModifiers());
 System.out.println("contrutor--name:"+constructor.getName());
 //拿到构造函数的参数类型
  Class[] classes =  constructor.getParameterTypes();
  for (int i = 0; i < classes.length; i++) {
  System.out.println("contrutor--getParameterType:"+classes[i].getName());
 }
 }
 //--------------------------------------------------------------------------------------  
 //拿到方法
 Method[] methods = stuClass.getMethods();
 for(Method method : methods){
 //拿到方法名
 System.out.println("method--name:"+method.getName());
 //拿到方法的返回参数
 System.out.println("method--turntype:"+method.getGenericReturnType());
 }
//--------------------------------------------------------------------------------------  
 //执行对象某个方法
 Student Student = new Student();
Class<? extends Student> stuActionClass = Student.getClass();
try {
//拿到对象的方法
Method method = stuActionClass.getMethod("getStudent", new Class[]{int.class});
//执行对象的方法
Student student1 = (Student) method.invoke(Student, new Object[]{new Integer(1)});
System.out.println(student1);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();

//--------------------------------------------------------------------------------------  
//通过类直接实例一个对象
Class<Student> studentActionClass  = Student.class;
try {
//拿到对象的方法
Method method = studentActionClass.getMethod("getStudent", new Class[]{int.class});
//执行对象的方法
Student student1 = (Student) method.invoke(Student, new Object[]{new Integer(1)});
System.out.println(student1);
} catch (Exception e) {
e.printStackTrace();

}
}
具体结果太长就不贴出来了...共同学习
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值