发表于: 2017-10-05 19:10:52
1 768
今天完成的事情:
一、Java reflect反射基础
(1)Java reflect的含义:
反射机制是程序在运行过程中,对于任意一个类可以可以获取它的属性和方法,对于任意一个对象可以调用它的属性和方法,动态的获取信息以及动态的调用对象。
(2)Java反射的作用:
·动态得加载类,调用对象属性和方法。
·获取任意个类的属性和方法
(3)根据Java反射机制来写一个工具类获取相关信息,这次实在idea中实践例子,也是学习idea这个现在比较流行的IDE工具软件。
1.首先是结构目录,这里直接建Java普通项目,不适用maven。
2. 建ClassInfo.java工具类
package com.lihq.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 工具类,用于获取某个类中信息,包括成员变量,成员方法。用的Java的反射相关知识
*/
public class ClassInfo {
public static void printClassInfo(Object obj){
/**
* 获取类中的成员变量的种类,返回值类型,参数类型
*/
System.out.println("成员变量:");
//1.定义Class类实例指向传入的类obj
Class c = obj.getClass();
//2.Class类中的getField方法获取该类的成员变量的类类型,返回Field数组
Field[] fs=c.getFields();
//3.获取fs的类类型,getType方法,返回Class类,目前只能获得Public类型的
for(Field field:fs){
Class fieldType=field.getType();
String fieldTypeName=fieldType.getSimpleName();
System.out.println(fieldTypeName+" "+field.getName());
System.out.println("-------------");
}
System.out.println();
/**
* 获取对象的成员方法
*/
//1.获取对象的方法,用methods[]方法
Method[] ms= c.getDeclaredMethods();
System.out.println("成员方方法:");
//2.获取方法的返回值类类型
for (Method method:ms){
Class returnType = method.getReturnType();
StringBuilder sb=new StringBuilder();
sb.append(returnType.getSimpleName()+"(");
//3.获取参数类类型
Class[] parameterType= method.getParameterTypes();
for (int i = 0; i < parameterType.length; i++) {
sb.append(parameterType[i].getSimpleName()+",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
System.out.println(sb);
System.out.println("------------");
}
}
}
3.新建测试类
package com.lihq.util;
import org.junit.Test;
import static org.junit.Assert.*;
public class ClassInfoTest {
public class A{
public A(){
}
public int i;
public String j;
public boolean m;
public double g;
public int sum(int a,int b){
return a+b;
}
public void addString (String a,int b){
System.out.println("shi");
}
}
@Test
public void printClassInfo() throws Exception {
ClassInfo.printClassInfo(new A());
}
}
4.测试的结果
成员变量:
int i
-------------
String j
-------------
boolean m
-------------
double g
-------------
成员方方法:
int(int,int)
------------
void(String,int)
------------
明天的计划:
1.学习springMVC
遇到的问题:
暂无
收获:
(1) Java的反射主要是依靠Class这个类来实现的,Class类的对象是其它普通类。图示:
(2) 从面向对象的角度来看,Java中定义的各种类例如User,这些类被称为POJO或者javabean。它们的实例化也就是u1,u2,它们都是User类的一个具体的实例,都具有User这个类的属性和方法。
(3) 如User这种类是非常多了,那么它们的共同点在哪里呢?其实不难发现它们都是具有属性和方法的封装体。从一切皆对象的角度来看,它们也是一种对象,也是一种实例,那么它们必然有一个类,这个类在Java里就是Class类,Class类可以说是类的类。从上面的图示也可看出Class类的实例c1,c2指向的是User这个类。
(4)Class类是不能通过new关键字来实例化的,它的构造函数是只能Java虚拟机加载的。那么实例化的方法主要有三种方式:
--1.已知一个类名,例User
Class c1=User.class;//这种直接 [类名].class方式获取实例化
--2.已知一个类的实例化,调用类方法getClass
Class c2=u2.getClass();
--3.通过Class类的方法forName()来加载普通类
Class c3=Class.forName("类的全称");//类的全称包括包名加类名
例如在JDBC连接数据库操作中,首先要做的就是加载驱动,其实就是第三种方式来获取Driver这个类,以MySQL数据库为例:
Class.forName("com.mysql.jdbc.Driver");//这是动态加载类
(5)通过Class类的获取普通类的实例化
c1.newInstance();
评论