泛型擦除 反射 自动装配

1.泛型擦除

package cn.itcast.demo;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Demo1 {

    public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        // 定义一个List<Integer>
        List<Integer> list = new ArrayList<Integer>();

        // 添加一个字符串 "abc"
        // list.add("abc");

        // 解决问题,使用反射
        // 1.得到List的Class。
        Class clazz = list.getClass();

        //2.通过clazz去获取add方法.
        Method addMethod=clazz.getMethod("add", Object.class);

        //3.调用add方法,将"abc"添加.

        addMethod.invoke(list, "abc");

        System.out.println(list);
    }
}

2.四种获取对象的方式.
1.new
2.反射
3.IO流(Object流) ----注意需要实现Serializable
4.clone() ---需要在类中重写clone()方法实现Cloneable接口.

package cn.itcast.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import org.junit.Test;

//获取对象
public class Demo2 {

    // 1.new
    @Test
    public void fun1() {
        Person p = new Person();
    }

    // 使用反射
    @Test
    public void fun2() throws ClassNotFoundException, InstantiationException,
            IllegalAccessException {
        Class c = Class.forName("cn.itcast.demo.Person");
        c.newInstance();
    }

    // 3.使用IO流.
    @Test
    public void fun3() throws FileNotFoundException, IOException {
        // 将一个对象写入到object.txt文件中.
        Person p = new Person();
        p.setName("tom");
        p.setSex("male");
        p.setAddress("北京");

        // 在java中如果描述路径要使用 两个\\,也可以使用一个/。

        File file = new File("D:/java0106/workspace/day02/src/object.txt");
        // // 绝对路径
        // 相对路径
        // File file=new File("src/object.txt");

        // 在开发中获取classpath路径。 获取我们的classpath路径的根目录. 那么如果文件存在于bin中,就可以直接在后面写路径
        // String path = Demo2.class.getResource("/object.txt").getPath();

        // File file=new File(path);

        // System.out.println(file.exists());

        writeObjectToFile(p, file);

    }

    @Test
    public void fun4() throws FileNotFoundException, IOException,
            ClassNotFoundException {
        File file = new File("D:/java0106/workspace/day02/src/object.txt");
        Person p = (Person) readObjectFromFile(file);

        System.out.println(p);
    }

    // 从文件中读取对象
    private Object readObjectFromFile(File file) throws FileNotFoundException,
            IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
        Object obj = ois.readObject();
        ois.close();
        return obj;
    }

    // 将对象写入到文件中的操作
    private void writeObjectToFile(Object obj, File file)
            throws FileNotFoundException, IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
                file));

        oos.writeObject(obj);
        oos.flush();
        oos.close();

    }

    // 使用克隆
    @Test
    public void fun5() throws CloneNotSupportedException {
        Person p = new Person();
        p.setName("tom");
        p.setSex("male");
        p.setAddress("北京");

        Person pp = (Person) p.clone(); // 得到一个p对象的副本

        System.out.println(pp);
    }
}

2

package cn.itcast.demo;

import java.io.Serializable;

public class Person implements Cloneable{// implements Serializable {

    // private static final long serialVersionUID = 1L;
    private String name;
    private String sex;
    private String address;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", sex=" + sex + ", address=" + address
                + "]";
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

3.自动装配操作.
创建一个Map集合.
map.put("name","tom");
map.put("sex","男");
map.put("address","北京");

Person类.
class Person{

private String name;
private String sex;
private String address;

get/set方法.
}

要求,使用反射,将map集合中key值与Person类中属性名相同的用key的value对Person类的属性赋值.

不使用Field类,使用 Method类操作.

package cn.itcast.demo;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.junit.Test;

public class Demo3 {

    public static void main(String[] args) throws SecurityException,
            NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "tom");
        map.put("sex", "男");
        map.put("address", "北京");

        Person p = new Person();

        // 1.得到集合中的所有key
        Set<String> keys = map.keySet();

        // 2.得到所有的Person类中的属性.
        Class clazz = p.getClass();
        Field[] fields = clazz.getDeclaredFields();// 属性是private

        // 3.遍历属性,判断keys是否包含这些属性.

        for (Field field : fields) {
            // 得到属性名称.
            String fieldName = field.getName();

            if (keys.contains(fieldName)) {
                // map集合的key中包含这样的属性名。那么就需要调用这个属性对应的set方法将key对应的value进行赋值操作.

                // 1.得到value
                String value = map.get(fieldName);

                // 2.得到属性对应的set方法
                Method setMethod = clazz.getMethod(getSetMethodName(fieldName),
                        String.class);

                //3.调用方法进行赋值.

                setMethod.invoke(p, value);

            }
        }

        System.out.println(p);
    }

    public static String getSetMethodName(String param) {

        return "set" + (char) (param.charAt(0) - 32) + param.substring(1);

    }

    @Test
    public void fun() {
        // ‘n‘---->N

        System.out.println((char) (‘n‘ - 32));

    }
}
时间: 2024-10-13 21:09:45

泛型擦除 反射 自动装配的相关文章

Autofac 组件、服务、自动装配 《第二篇》

一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择一个合适的构造函数,创造这个对象的实例.主要通过RegisterType<T>() 和 RegisterType(Type) 两个方法以这种方式建立. ContainerBuilder使用 As() 方法将Component封装成了服务使用. builder.RegisterType<Aut

[email&#160;protected]注解与自动装配

1   配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss 拥有 Office 和 Car 类型的两个属性:       清单 3. Boss.java [java] view plaincopy package com.baobaotao; public class Boss { private Car car; private Office office

spring框架学习(四)自动装配

spring框架学习(四)自动装配 set注入和构造注入有时在做配置时比较麻烦.所以框架为了提高开发效率,提供自动装配功能,简化配置.Spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的autowire属性 自动装配属性有6个值可选,分别代表不同的含义. 1,byName 从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值.如果有相同的,那么获取这个对象,实现关联

Spring框架之自动装配

Spring的IoC容器通过Java反射机制了解了容器中所存在Bean的配置信息,这包括构造方法的结构,属性的信息,而正是由于这个原因,Spring容器才能通过某种规则来对Bean进行自动装配,而无须通过显式的方法进行配置. 一.自动装配类型:Spring IoC容器可以自动装配相互协作Bean之间的关联关系.因此,可以自动使Spring通过检查BeanFactory中的内容,来指定Bean协作(其它被依赖的Bean),,下面来介绍这4种类型: 1.byName类型:根据属性名自动装配.此类型将

Spring——自动装配

基于J2EE平台的框架很多,并且大多数框架中都有着庞大复杂的配制文件,维护起来很不方便,Spring在支持配置文件时也提供了一套能让程序员偷懒的小规则:自动装配. Spring的IOC容器通过Java反射机制了解了容器中所存在Bean的配置信息,这包括构造函数方法的结构,属性的信息,而正是由于这个原因,Spring容器才能够通过某种规则来对Bean进行自动装配,而无须通过显式的方法来进行配制. 自动装配模式: 主要介绍:根据名称自动装配.根据类型自动装配. 根据名称自动装配: 根据类型自动装配:

使用Spring的JavaConfig 和 @Autowired注解与自动装配

1 JavaConfig  配置方法 之前我们都是在xml文件中定义bean的,比如: 1 2 3 4 5 6 7 8 <beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://www.springframework

【Spring】Spring自动装配深入浅出

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka set注入和构造注入有时在做配置时比较麻烦.所以框架为了提高开发效率,提供自动装配功能,简化配置.Spring框架式默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的autowire属性.自动装配属性有5个值可选,分别代表不同的含义. 1.byName 从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<be

Java高质量代码之 — 泛型与反射

在Java5后推出了泛型,使我们在编译期间操作集合或类时更加的安全,更方便代码的阅读,而让身为编译性语言的Java提供动态性的反射技术,更是在框架开发中大行其道,从而让Java活起来,下面看一下在使用泛型和反射需要注意和了解的事情? 1.Java的泛型是类型擦除的????? Java中的泛型是在编译期间有效的,在运行期间将会被删除,也就是所有泛型参数类型在编译后都会被清除掉.请看以下例子? Java代码??? publicstaticvoid?test(List??testParameter)?

spring装配---处理自动装配的歧义性

一.歧义性 当我们使用spring的注解进行自动装配bean时,如果不仅有一个bean能够匹配结果的话,会抛出NoUniqueBeanDefinitionException: 例如本例中 当spring尝试为DuckBasket类注入duck属性时就会抛出该异常 因为greenDuck类,和redDuck类都实现了Duck接口,换言之,Duck类型有两个实现类,也就是有两个可以匹配的bean造成了歧义性,spring不知道该注入哪个bean给该属性. 二.解决方法 (1)标识首选的bean--通