关于反射机制的探讨

参考网址
参考视频教程
学习资料学习笔记个人源码(里面有从反射原理到各个函数的使用,以及自定义注解的实现)
自定义注解见

  • 这是一个通过反射机制来遍历实体的代码段

     					/*检验代码*/
                                                     /*gareport是某实体*/
     					/***********************************/
     					/*Class c=gareport.getClass();
     					Field[] declaredFields = c.getDeclaredFields();
     					 for (Field field : declaredFields) {
     				            System.out.println(field.getType().getName());
     				            if("java.lang.String".equals(field.getType().getName())) {
     				            	String name = field.getName();
     				            	name  = name.substring(0,1).toUpperCase()+name.substring(1);
     				            	System.out.println("ssssssssssssssssssssssssss格式化后的名称"+name);
     								Method m2 = gareport.getClass().getMethod("set" + name, field.getType());
     								try {
     									m2.invoke(gareport, "");
     								} catch (Exception e) {
     									System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaa出错了");
     									break;
     								}
     								Method m1 = gareport.getClass().getMethod("get" + name);
     								System.out.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx滞空口的值"+m1.invoke(gareport));
     								try {
     									gareportMapper.insertSelective(gareport);
     									System.out.println("ppppppppppppppppppppppppppppp成功后的值"+name);
     									break;
     								} catch (Exception e) {
     									// TODO: handle exception
     								}
     				            }
     				        }*/
    
  • 另外几种实现方式:

	@Test
	public void testReflect() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		Books books = new Books();
		books.setBookname("钢铁是怎样炼成的");
		books.setId(1);
		books.setPrices(35.3);
		books.setCounts(1111);
		books.setTypeid(888888);
		Class cls = Books.class;
		Field[] fields = cls.getDeclaredFields();
		for (int i = 0; i < fields.length; i++) {
			try {
				// 得到属性
				Field field = fields[i];
				// 打开私有访问
				field.setAccessible(true);
				// 获取属性
				String name = field.getName();
				// 获取属性值
				Object value = field.get(books);
				// 得到此属性的类型
				String type = field.getType().toString();
				System.out.println("===name===" + name + "===value===" + value + "===type===" + type);
				// 设置属性值    方法一
				if (type.endsWith("String")) {
					field.set(books, "鲁宾孙漂流记"); // 给属性设值
				} else if (type.endsWith("int") || type.endsWith("Integer")) {
					field.set(books, 12); // 给属性设值
				} else {
					System.out.println(field.getType() + "\t");
				}

			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		try {
			//设置属性值   方法二
			/* 
			* 得到类中的方法 
			*/
			Method[] methods = Books.class.getMethods();
			for (int i = 0; i < methods.length; i++) {
				Method method = methods[i];

				if (method.getName().startsWith("get")) {
					System.out.print("methodName:" + method.getName() + "\t");
					System.out.println("value:" + method.invoke(books));//得到get 方法的值  
				}
			} 
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}  		
		//根据字符串生成bean并设置属性
		System.out.println("====================根据字符串生成bean并设置属性====================================");
		System.out.println("=============第一种方式,需要提供空的构造方法==================");
		String  className = "Books";
		Class<?> clazz = Class.forName("com.example.demo.entity."+className);
		Object obj = clazz.newInstance();
		if(obj instanceof Books) {
			Books books2 = (Books) obj;
			books2.setId(1);
			books2.setBookname("骆驼祥子");
			System.out.println(books2.toString());
		}
		System.out.println("============第二种方式  需要对应的构造函数  空的话不需要===================");
		
		String className2 = "HaveBooks";
		Class<?> clazz2 = Class.forName("com.example.demo.entity."+className2);
		Constructor<?> constructor = clazz2.getConstructor(String.class);//需要对应的构造函数  空的话不需要
		Object obj2 = constructor.newInstance("ppppppppppp");
		System.out.println("============="+obj2.getClass());
		if(obj2 instanceof HaveBooks) {
			HaveBooks HaveBooks = (HaveBooks) obj2;
			System.out.println(HaveBooks.toString());
		}
		System.out.println("============第三种方式=======================================");
		
		String className3 = "Image";
		Class<?> clazz3 = Class.forName("com.example.demo.entity."+className3);
		Object obj3 = Class.forName("com.example.demo.entity."+className3).newInstance();
		Field idField = clazz3.getDeclaredField("id");
		Field imageField = clazz3.getDeclaredField("image");
		//设为私有属性可访问
		idField.setAccessible(true);
		imageField.setAccessible(true);
		idField.set(obj3, 1);
		imageField.set(obj3, "testImage");
		if(obj3 instanceof Image) {
			Image image1 = (Image)obj3;
			System.out.println(image1.toString());
		}
		
		System.out.println("===============实际应用===========================");

		String className4 = "Data";
		Class<?> clazz4 = Class.forName("com.example.demo.entity."+className4);
		Object obj4 = clazz4.newInstance();
		Method m = obj4.getClass().getMethod("setTop", double.class);
		m.invoke(obj4, 12.0);
		System.out.println(obj4.toString()+"======="+obj4.getClass());
		//得到top这个值
		Method m2 = obj4.getClass().getMethod("getTop");
		Double invoke = (Double) m2.invoke(obj4);
		System.out.println(invoke);				
	}

上述代码的demo及所用类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PH = 7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值