java的反射基础入门

1.获取反射Class类的方式

Class.forName("全类名");

类名.class//需要在JVM已加载的前提下

对象.getClass

2.java对javabean进行操作的四种方式

public class Descriptor {

        public static void main(String[] args) throws Exception {

               // 方式1

               PropertyDescriptor descriptor = new PropertyDescriptor("x", TestDemo1.class);

               Method readMethod = descriptor.getReadMethod();

               TestDemo1 testDemo1 = new TestDemo1();

               Object invoke = readMethod.invoke(testDemo1);

               if (invoke instanceof String) {

                       System.out.println((String) invoke);

               }

               // 方式2 这个方法只能得到所有的方法

               BeanInfo beanInfo = Introspector.getBeanInfo(TestDemo1.class);

               PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();

               for (PropertyDescriptor propertyDescriptor : descriptors) {

                       if (propertyDescriptor.getName().equals("x")) {

                               System.out.println(propertyDescriptor.getName());

                       }

               }

               // 方式3

               Class testClass = TestDemo1.class;

               Object newInstance = testClass.newInstance();

               if (newInstance instanceof TestDemo1) {

                       System.out.println(((TestDemo1) newInstance).getX());

               }

               // 方式4

               Class testClass1 = Class.forName("cn.reflect.collection.TestDemo1");

               Field declaredField = testClass1.getDeclaredField("x");

               if (!declaredField.isAccessible()) {

    //类似与上判断是否是公有的属性

    // if(!Modifier.isPublic(declaredField.getModifiers())){

                       declaredField.setAccessible(true);

               }

                System.out.println(declaredField.get(testDemo1));

        }

}

class TestDemo1 {
        private String x = "qwe";

        public String getX() {
               return x;
        }

        public void setX(String x) {
               this.x = x;
        }

}

3.利用反射获取注解

//RetentionPolicy  枚举  RetentionPolicy.RUNTIME 运行时起作用,必须使用运行时才能够反射

@Retention(RetentionPolicy.RUNTIME)//元注解

// ElementType 枚举 ElementType.TYPE 修饰于类,接口,枚举,注解

@Target(ElementType.TYPE)

@interface ReflectAnnotationdemo1 {

        // value可以省略 value= ,省略的前提是只有

        String value();

}

@ReflectAnnotationdemo1("111")

class AnnotationDemo1 {

}

 public class AnnotationDemo {

        public static void main(String[] args) {

               AnnotationDemo1 annotationDemo1 = new AnnotationDemo1();

               Class<? extends AnnotationDemo1> class1 = annotationDemo1.getClass();

               if (class1.isAnnotationPresent(ReflectAnnotationdemo1.class)) {

                       ReflectAnnotationdemo1 annotation = class1.getAnnotation(ReflectAnnotationdemo1.class);

                       System.out.println(annotation.value());

               }

        }

}

4.对泛型的反射

public class ReflectGenericity {
	private static final String ParameterizedType = null;

	public static void main(String[] args) throws NoSuchMethodException, SecurityException {
		//获取父类的参数化类型
		Type genericSuperclass = ReflectGenericityTest1.class.getGenericSuperclass();
		if (genericSuperclass instanceof ParameterizedType) {
			Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
			System.out.println(actualTypeArguments[0]);
		}
		//获取类型
		Method[] methods = ReflectGenericityTest.class.getMethods();
		for (int i = 0; i < methods.length; i++) {
			if(methods[i].getName().equals("test1")){
				Parameter[] parameters = methods[i].getParameters();
				System.out.println(parameters[0]);
				break;
			}
		}
		//获取参数化类型
		Method method = ReflectGenericityTest.class.getMethod("test2", Vector.class);
		Type[] genericParameterTypes = method.getGenericParameterTypes();
		System.out.println(genericParameterTypes[0]);
	}
}

class ReflectGenericityTest<T> {
	public static <E> E test1(E e) {
		return e;
	}
	public static void test2(Vector<String> e) {
	}
}

class ReflectGenericityTest1<T> extends ReflectGenericityTest<T> {
}

5.反射的工具类

public class ReflectUtils {
	public static Class getSuperClass(Class clazz, int index) {
		Type gentype = clazz.getGenericSuperclass();
		if (!(gentype instanceof ParameterizedType)) {
			return Object.class;
		}
		Type[] params = ((ParameterizedType) gentype).getActualTypeArguments();
		if (index >= params.length || index < 0) {
			return Object.class;
		}
		if (!(params[index] instanceof Class)) {
			return Object.class;
		}
		return (Class) params[index];
	}

	public static <T> Class<T> getSupergType(Class clazz) {
		return getSuperClass(clazz, 0);
	}

	public static Method getDecaredMethod(Object obj, String methoname, Class<?>[] paraterty) {
		for (Class clazz = obj.getClass(); clazz != Object.class; clazz.getSuperclass()) {
			try {
				return clazz.getDeclaredMethod(methoname, paraterty);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	public static void makeAccsible(Field field) {
		// getmodifys获取各种权限的叠加整型
		if (Modifier.isPublic(field.getModifiers())) {
			field.setAccessible(true);
		}
	}

	public static Field getDecaredMethod(Object obj, String fieldname) {
		for (Class clazz = obj.getClass(); clazz != Object.class; clazz.getSuperclass()) {
			try {
				return clazz.getDeclaredField(fieldname);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		// ArrayList<Object> arrayList = new ArrayList<String>();
		return null;
	}

	public static Object invokeMethod(Object obj, String methoname, Class<?>[] paraterty, Object[] parame) {
		Method method = getDecaredMethod(obj, methoname, paraterty);
		if (method == null) {
			throw new IllegalAccessError();
		}
		if (Modifier.isPublic(method.getModifiers())) {
			method.setAccessible(true);
		}
		try {
			method.invoke(obj, parame);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void setFieldValue(Object obj, String fieldname, Object param) {
		Field field = getDecaredMethod(obj, fieldname);
		if (field == null) {
			throw new IllegalAccessError();
		}
		makeAccsible(field);
		try {
			field.set(obj, param);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	public static Object geyFieldValue(Object object, String name) {
		Field field = getDecaredMethod(object, name);
		if (field == null) {
			throw new IllegalArgumentException("not find field!");
		}
		try {
			field.get(object);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return null;
	}
}

原文地址:https://www.cnblogs.com/gg128/p/9311210.html

时间: 2024-08-02 10:03:27

java的反射基础入门的相关文章

Java:反射基础

Java:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识.这个对象追踪着每个对象所属的类.虚拟机利用运行时类的信息选择相应的方法执行. 我们可以通过专门的Java类访问这些信息.保存这些信息的类称为Class. 根据对象获得类信息: MyClass myClass; ..... Class cl = myClass.getClass(); cl.get

Java的反射基础技术

今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 什么是反射? 反射它是根据字节码文件可以反射出类的信息.字段.方法.构造方法等内容,还可以创建对象调用方法,我们称它为反射技术. 如何通过反射获取Class对象了? 它有三种方法,1.通过Class获取类对象 2.通过getClass()方法获取类对象 3.通过Class.forName(“完整类名”)获取类对象 案例:通过反射获得Class对象的3种方法 C

java的反射机制入门

理解Java的反射机制对学习Java框架有很大帮助,比如Spring框架的核心就是使用Java反射实现的,同时对做一些Java底层操作也会有帮助,比如字节码操作.自定义注解等. 什么是反射 Java反射说的是在运行状态中,对于任何一个类,我们都能够直到这个类有哪些方法和属性.对于任何一个对象,我们都能够对它的方法和属性进行调用.这种动态获取对象信息和调用对象方法的功能就是Java的反射机制. 反射的三种方式 反射其实就是获取类的字节码文件,也就是.class文件,那么我们就可以通过Class这个

Java学习-反射机制入门

1.反射机制 我们在正常的使用过程之中只关心类产生对象,而后通过对象调用类之中的方法,可是,除了这种传统的方式外,也可以利用反射操作. 1.1.认识反射 既然有反,那么一定存在有正,正是指通过类产生对象,而后通过对象执行操作.而反呢?通过对象找到它所在类的信息.所有的对象都支持反这一操作,因为Object类有一个方法:public final Class<?> getClass(). 1 package cn.kvikon.demo; 2 import java.util.Date; 3 4

Java 之 Servlet 基础入门

Servlet 一.什么是 Servlet 1.概念 Servlet:server applet,是指运行在服务器端的小程序 2.Servlet   servlet 就是一个接口,定义了 Java 类被浏览器访问到(tomcat识别)的规则.   二.Servlet 执行原理 1.入门案例 (1)创建 JavaEE 项目 (2)定义一个类,实现 Servlet 接口 public class ServletDemo1 implements Servlet (3)实现接口中的抽象方法 1 impo

java的注解基础入门

1.常用的注解 @overrive继承//继承的方法时建议都添加该注解,防止我们不是重写方法 @deprecated  废弃的方法 @suppresswarning  警告信息,属性值all表示所有的意思 2.元注解 @target描述注解使用的范围 说明 @target(value=ElementType.值) 属性值: Package  使用范围包 Type     使用范围类接口枚举annotation类型 Constructor   使用范围构造器 Field   使用范围属性 Meth

java的泛型基础入门

1.泛型的作用 防止随意的放置任何的对象,使用泛型后只能按我们使用时指定的类型添加以及会相应的进行编译时检查,在编译检查后会去除相应的泛型信息(运行时没有这个信息了),在类型转换的也会自动的相应的转换为相应的信息 public class GenenricyDemo1 { public static <T> T test1(T t){ return t; } public <T> T test2(T t){ return t; } public static void main(S

java网络爬虫基础学习(一)

刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网下载网页,是搜索引擎的重要组成部分. 传统爬虫: 获得URL ->放入队列 ->抓取网页,分析信息 ->新的URL ->放入队列 ->抓取网页,分析信息... ->满足一定条件,停止. 聚焦爬虫: 根据一定的网页分析算法过滤与主题无关的链接

Java反射基础笔记

由于工作中发现自己的基础知识掌握的并不是很牢固,遇到的问题与学习的东西也没有很好的做过记录,导致再遇到时耗费大量时间上网搜索,所以决定串下基础知识并尽量形成记录,方便自己之后遗忘时查询,也方便各位有需求的伙伴翻阅查看,大家共同探讨.学习. 本次梳理的是Java反射的基础,该系列为笔者学习慕课反射讲解视频的学习笔记,尽可能全的记录,以帮助初学者快速掌握反射基础知识,如需转载该系列请注明原文链接. 一.反射之Class类的使用 二.反射之获取方法信息 更多编辑中 --