zoukankan      html  css  js  c++  java
  • 继承,强转,泛型解决设置共同属性的问题

     有个妹子比较懒,改造自己的方法的时候,为了省时省力找到了我,尽量少改代码,实现为对象赋值的功能。这些属性set方法一致。

    我这里想到的三个方法如下:

    1.写一个基类,基类中定义共同的属性,那么就可以调用基类的方法实现对属性赋值。 见 test1

    2.在赋值的方法中将所有需要赋值的类型枚举出来,分别强转然后赋值。 见test2

    3.使用泛型,反射调用方法。 见test3

    JunitTest.java

    package yun.web;
    
    import org.junit.Test;
    
    public class JunitTest {
    	
    	@Test
    	public void test1() {
    		BaseTest a = new C();
    		BaseTest b = new D();
    		a.setName("zs");
    		b.setName("lisi");
    		System.out.println(a.getName());
    		System.out.println(b.getName());
    	}
    	
    	@Test
    	public void test2() {
    		A a = new A();
    		B b = new B();
    		ReflectTest<A> ta = new ReflectTest<JunitTest.A>();
    		ReflectTest<B> tb = new ReflectTest<JunitTest.B>();
    		ta.setParam2(a);
    		tb.setParam2(b);
    		System.out.println(a.getName());
    		System.out.println(b.getName());
    	}
    	
    	@Test
    	public void test3() {
    		A a = new A();
    		B b = new B();
    		ReflectTest<A> ta = new ReflectTest<JunitTest.A>();
    		ReflectTest<B> tb = new ReflectTest<JunitTest.B>();
    		ta.setParam3(a);
    		tb.setParam3(b);
    		
    		System.out.println(a.getName());
    		System.out.println(b.getName());
    	}
    	
    	class A {
    		
    		private String name;
    
    		public String getName() {
    			return name;
    		}
    
    		public void setName(String name) {
    			this.name = name;
    		}
    	}
    
    	class B {
    		private String name;
    
    		public String getName() {
    			return name;
    		}
    
    		public void setName(String name) {
    			this.name = name;
    		}
    	}
    	
    	class C extends BaseTest {
    		
    	}
    	
    	class D extends BaseTest {
    		
    	}
    }
    

      

      ReflectTest.java

    package yun.web;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    
    public class ReflectTest<T> {
    
    	public void setParam3(T t) {
    		try {
    			Method m = t.getClass().getDeclaredMethod("setName", String.class);
    			m.invoke(t, "zs");
    		} catch (NoSuchMethodException e) {
    			e.printStackTrace();
    		} catch (SecurityException e) {
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			e.printStackTrace();
    		} catch (IllegalArgumentException e) {
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void setParam2(T t) {
    		if (t instanceof yun.web.JunitTest.A) {
    			((yun.web.JunitTest.A) t).setName("qihh");
    		}
    		if (t instanceof yun.web.JunitTest.B) {
    			((yun.web.JunitTest.B) t).setName("guozl");
    		}
    		
    	}
    	
    }
    

      BaseTest.java

    package yun.web;
    
    public class BaseTest {
    
    	private String name;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	
    	
    }
    

      

  • 相关阅读:
    [FAQ] GitHub 开启二次验证之后,如何通过 https clone 项目 ?
    [FAQ] GoLand 需要手动开启代码补全吗 ?
    [FAQ] 夏玉米 按规则查询域名靠谱吗 ?
    [FAQ] Error: com.mysql.jdbc.Driver not loaded. :jdbc_driver_library
    [php-src] Php内核的有趣高频宏
    [php-src] Php扩展开发的琐碎注意点、细节
    [ELK] Docker 运行 Elastic Stack 支持 TLS 的两种简单方式
    [Contract] Solidity 生成随机数方案
    [MySQL] 导入数据库和表的两种方式
    [ELK] 生产环境中 Elasticsearch 的重要配置项
  • 原文地址:https://www.cnblogs.com/yun965861480/p/6884684.html
Copyright © 2011-2022 走看看