15、java反射

java反射

什么是反射?

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制

获取反射的三种方法

  1. 通过Class.forName(包名.类名);

    ​ 比如: Class cls = Class.forName ("day02.com.instance.Dog");

  2. 通过 类名.class();

    ​ 比如: Class cls = Dog.class () ;

  3. 通过对象的getClass();

    比如: Dog dog = new Dog();

    Class cls = dog.getClass ();

	//获取反射的三种方式
		//1.直接通过包名类名获取
		Class cls = Class.forName("day02.com.instance.Dog");
		//2.通过类名获取
		cls = Dog.class;
		//3.通过对象获取
		Dog wangcai = new Dog("旺财",10);
		cls = wangcai.getClass();

通过反射获取属性:

  1. 通过cls 调用 getDeclaredFields() 得到field[],获取到所有的属性,包括私有的。

  2. 返回一个类名

    **getSimpleName**()
    
//获取反射中的对象的所有属性
	/**	Field [] fs = cls.getDeclaredFields();
		for (Field field : fs) {
			//获取属性的名字
			System.out.println(field.getName());
			//获取属性的类型
			System.out.println(field.getType().getName());
			//获取属性的值(要通过对象获取特定对象的某个属性值)
			//要看访问修饰符,不然会报异常
			System.out.println(field.get(wangcai));
			//给属性赋值
			if("name".equals(field.getName())) {
				field.set(wangcai, "大黄");
			}
		}
		System.out.println(wangcai);*/

通过反射获取方法:

//获取到反射中所有的方法(不包含构造方法)
		Method[] me =  cls.getDeclaredMethods();
		for (Method method : me) {
			//获取方法的mingc
			//System.out.println(method.getName());
			//获取所有方法的返回值类型
			//System.out.println(method.getReturnType().getName());
			//以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符
			//System.out.println(method.getModifiers());
			// 按照声明顺序返回 Class 对象的数组,
			//这些对象描述了此 Method 对象所表示的方法的形参类型
			//System.out.println(method.getParameterTypes());
			//利用方法来调用对象的方法
			if("getName".equals(method.getName())) {
				System.out.println(method.invoke(wangcai));
			}
		}

通过反射创建对象:

	
	//利用反射来创建对象
		Object obj = cls.newInstance();

通过反射获取所有的构造方法:

cls.getDeclaredConstructors()	
返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法	

ResultSetMetaData

通过ResultSet.getMetaData()获取,可以得到数据库中的列的个数,列名,列的类型

ResultSetMetaData rsmd = ResultSet.getMetaData();

  1. 获取指定列的个数: rsmd.getColumnCount(int index );
  2. 获取指定列名: rsmd.getColumnName(int index);
  3. 获取指定列的类型: rsmd.getColumnType(int index);

有什么用呢?

可以通过指定的列名跟实体类的成员变量是相同的情况下,我们就可以直接给实体类赋值了。

代码分层

为什么要代码分层呢?

在大型的项目中,代码量很多,如果都放在一个包中,在检查bug的时候就不利于我们改bug,也不利于我们进行维护。所有我们将代码分类,分成三层架构控制层(controller),业务逻辑层(Service),数据层(dao),以及我们的实体类(po),还可以有更的包将他们分类,比如说专门提供工具的类的包util等。

我们在写的时候也许增加我们的代码量,但在我们维护的过程中,就可以通过层次来排查,大大的提高了我们维护的效率。

三层架构

在业务逻辑层和数据层,我们定义一个接口,然后用接口对象引用一个实现类的对象,比如:

接口 接口的引用 实现类

UserDao userDao = new UserDaoImpl();

这样降低代码的耦合,当我们的业务逻辑改变的时候,我们只需要改变实现类就行,其他的代码就不能改,这就是接口编程。

posted @ 2022-03-17 20:25  站着说话不腰疼  阅读(48)  评论(0)    收藏  举报