java内省 introspector

Posted Advancing Swift

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内省 introspector相关的知识,希望对你有一定的参考价值。

javaBeans 属性的概念

不只是字段,而是其get set 方法

且该get方法有返回值的称为属性,继承Object类的getClass方法

package com.swift.demo1;

public class Person {
    String name;
    int age;
    String password;
    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;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAd() {//这个算一个属性,虽让没有字段,但如果没有返回值不算一个属性
        return "getAd.....";
    }
}

属性个数

package com.swift.demo1;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

import org.junit.jupiter.api.Test;

public class TestIntro {
    @Test
    public void test1() throws Exception {
        BeanInfo info=Introspector.getBeanInfo(Person.class);
        PropertyDescriptor[] pds=info.getPropertyDescriptors();
        for(PropertyDescriptor des:pds) {
            System.out.println(des.getName());
        }
    }
}

阻止父类的getClass属性用

package com.swift.demo1;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

import org.junit.jupiter.api.Test;

public class TestIntro {
    @Test
    public void test1() throws Exception {
        BeanInfo info=Introspector.getBeanInfo(Person.class,Object.class);
        PropertyDescriptor[] pds=info.getPropertyDescriptors();
        for(PropertyDescriptor des:pds) {
            System.out.println(des.getName());
        }
    }
}

 


 

 

BeanUtils使用jar包

需要两个:

都可以在Apache网站下载

BeanUtils具有比Introspector更强大的功能,可以在基本数据类型间直接转换,也可以把文本框中的字符串通过注册器转换器进行转换

自己转日期格式

package com.swift.demo1;

import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.junit.Test;

public class TestUtils {
    @Test
    public void test() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
        Person p=new Person();
        
        ConvertUtils.register(new Converter() {

            @Override
            public Object convert(Class type, Object value) {
                String str=(String) value;
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
                try {
                    return sdf.parse(str);
                } catch (ParseException e) {
                    throw new RuntimeException(e);//
                }
            }
        }, Date.class);
        
        BeanUtils.setProperty(p, "name", "swift");
        BeanUtils.setProperty(p, "age", "30");
        BeanUtils.setProperty(p, "password", "123");
        BeanUtils.setProperty(p, "date", "2018-02-19");
        
        System.out.println(p.getName());
        System.out.println(BeanUtils.getProperty(p, "name"));
        System.out.println(BeanUtils.getProperty(p, "age"));
        System.out.println(BeanUtils.getProperty(p, "password"));
        System.out.println(BeanUtils.getProperty(p, "date"));
    }
}

可以用现成的

package com.swift.demo1;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.junit.Test;

public class TestUtils {
    @Test
    public void test() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
        Person p=new Person();
        
        ConvertUtils.register(new DateLocaleConverter(),Date.class);
        
        BeanUtils.setProperty(p, "name", "swift");
        BeanUtils.setProperty(p, "age", "30");
        BeanUtils.setProperty(p, "password", "123");
        BeanUtils.setProperty(p, "date", "2018-02-19");
        
        System.out.println(p.getName());
        System.out.println(BeanUtils.getProperty(p, "name"));
        System.out.println(BeanUtils.getProperty(p, "age"));
        System.out.println(BeanUtils.getProperty(p, "password"));
        System.out.println(BeanUtils.getProperty(p, "date"));
    }
}

集合map加到BeanUtils

package com.swift.demo1;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.junit.Test;

public class TestUtils {
    @Test
    public void test() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
        Person p=new Person();
        
        ConvertUtils.register(new DateLocaleConverter(),Date.class);
        
        BeanUtils.setProperty(p, "name", "swift");
        BeanUtils.setProperty(p, "age", "30");
        BeanUtils.setProperty(p, "password", "123");
        BeanUtils.setProperty(p, "date", "2018-02-19");
        
        System.out.println(p.getName());
        System.out.println(BeanUtils.getProperty(p, "name"));
        System.out.println(BeanUtils.getProperty(p, "age"));
        System.out.println(BeanUtils.getProperty(p, "password"));
        System.out.println(BeanUtils.getProperty(p, "date"));
    }
    
    @Test
    public void test1() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        
        Person p=new Person();
        
        ConvertUtils.register(new DateLocaleConverter(),Date.class);
        
        Map<String, String> map=new HashMap<String, String>();
        map.put("name", "swift");
        map.put("age", "30");
        map.put("password", "123");
        map.put("date", "2018-02-19");
        
        BeanUtils.populate(p, map);
        
        System.out.println(p.getName());
        System.out.println(BeanUtils.getProperty(p, "name"));
        System.out.println(BeanUtils.getProperty(p, "age"));
        System.out.println(BeanUtils.getProperty(p, "password"));
        System.out.println(BeanUtils.getProperty(p, "date"));
    }
}

 

以上是关于java内省 introspector的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java:内省(Introspector)

java内省 introspector

Java中的内省(introspector)

[新手学Java]使用内省(Introspector)操作JavaBean属性

Apache BeanUtils的原理:Java内省(Introspector)

内省(Introspector)