java 通过反射获取调用类方法及属性

首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中

反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做这些事,一般反射大多是用于在构建类的实例以及调用类方法及属性。

ok! 了解了反射是什么以及反射的应用领域,那么就来看看Java中是怎么实现反射的吧

Student类

public class Student {
    public String name;
    public String gender;
    public int age;
    
    public Student(){
        
    }

}

使用反射获取类的实例

public class Test {
    public static void main(String[] args)throws ReflectiveOperationException {
        //通过三种方式获取类的类对象
        Class<?> c=Student.class;
        Class<?> c1=new Student().getClass();
        Class<?> c2=Class.forName("Student");//通过包名.类名获取类对象(因为该类在default包,所以可以不写包名)
        //通过类对象来构建student实例,效果和new  Student()一样,要求Student中必须要有无参的构造函数
        Student s=(Student) c.newInstance();
        Student s1=(Student) c1.newInstance();
        Student s2=(Student) c2.newInstance();
        
        
        s.age=1;
        s1.age=2;
        s2.age=3;
        
        
        System.out.println(s.age);
        System.out.println(s1.age);
        System.out.println(s2.age);
    }

可以看到,正确的输出了1,2,3

通过反射获取类的属性及方法,动态执行

下载地址  最流行的java后台框架 springmvc mybaits

Student类型

public class Student {
    public String name;
    private int age;//该属性为私有,可以通过反射获取得到
    
    public Student(){
        
    }
    
    public int add(int a,int b){
        return a+b;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "name="+name+"\nage="+age;
    }

}

动态的给类的属性赋值和调用类的方法

public class Test {
    public static void main(String[] args)throws ReflectiveOperationException {
        //获取类对象
        Class<?> c=Class.forName("Student");
        
        //获取类的属性对象,需要填写属性对象的名称
        Field f1=c.getField("name");//只能获取public的对象
        Field f2=c.getDeclaredField("age");//可以获取到private的对象,这很吊吧
        
        
        f2.setAccessible(true);//如果属性是私有的,那么就需要设置可访问
        Student s1=(Student) c.newInstance();
        //为属性对象赋值
        f1.set(s1, "张三");
        f2.set(s1, 22);
        
        System.out.println(s1.toString());
        
        //通过类对象获取类的方法
        Method m1=c.getMethod("add", int.class,int.class);
        
        //动态的执行方法
        int sum=(int) m1.invoke(s1, 1,2);
        System.out.println(sum);
                
    }

}
时间: 2024-08-03 19:06:35

java 通过反射获取调用类方法及属性的相关文章

java通过反射获取调用变量以及方法

一:反射概念 可以通过Class类获取某个类的成员变量以及方法,并且调用之. 二:通过反射获取方法.变量.构造方法 1 @Test 2 // 通过反射获取类定义的方法 3 public void testMethod() throws Exception { 4 @SuppressWarnings("rawtypes") 5 Class clazz = Class.forName("java.lang.String"); 6 Method[] m = clazz.g

Java反射获取对象VO的属性值(通过Getter方法)

有时候,需要动态获取对象的属性值. 比如,给你一个List,要你遍历这个List的对象的属性,而这个List里的对象并不固定.比如,这次User,下次可能是Company. e.g. 这次我需要做一个Excel导出的工具类,导出的批量数据是以List类型传入的,List里的对象自然每次都不同,这取决于需要导出什么信息. 为了使用方便,将对象的属性名与属性值存于Map当中,使用时就可以直接遍历Map了. 此次的思路是通过反射和Getter方法取得值,然后记录在一个Map当中. Kick start

java利用反射机制判断对象的属性是否为空

java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String>(); validateMap.put("serial", "编号");validateMap.put("major", "专业"); public static <T> String validateFiledIs

java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; import java.io.Serializable; public class Creature<T> implements Serializable { private char gender; public double weight; private void breath() { Syste

Java 使用反射获取类、方法、属性上的注释

有的时候我们想使用反射获取某个类的注释.方法上的注释.属性上的注释. 下面是一个简单的例子.里面包括了上面提到的三个点. package com.mine.practice.reflectfield; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; import javax.xml.bind.annotation.XmlAccessTy

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

java通过反射获取私有的构造方法,及反射擦除泛型数据类型约束

/* * 反射获取私有的构造方法运行 * 不推荐,破坏了程序的安全性,封装性 * 暴力私有 */ public class ReflectDemo4 { public static void main(String[] args)throws Exception { Class c=Class.forName("demo01.Person"); Constructor con=c.getDeclaredConstructor(int.class,String.class); //Con

java 反射获取类的静态属性值

public class AppTest { private NodeClass nodeClass; public static String hehe = "hehe"; public String xixi = "xixi"; public void test() { Field[] fields = AppTest.class.getDeclaredFields(); try { for (Field field : fields) { field.setA

java利用反射机制完成JavaBean的属性赋值

今天碰到一个场景,就是一个JavaBean,有些属性的值需要去数据库其他表中获取,这样就需要调用其他dao方法得到这个值,然后再set进去. 可是问题来了,如果需要用这种方式赋值的属性特别多的话,一个一个set进去就需要写很多set方法,代码不仅冗余,而且很麻烦. 于是就想通过反射机制去自动set值. 假设有JavaBean为CreditRatingFile.java类,某些属性值需要调用CreditRatingFileApplyService类中的方法获得,并拿到返回值再set出这些属性. 一