1,创建Person类
2,反射测试类
package reflect; import java.io.InputStream; import java.util.List; public class Person { public String name="aaaaa"; private int password; private static int age; public Person() { System.out.println("person"); } public Person(String name){ System.out.println("person "+name); } public Person(String name,int password){ System.out.println("person "+name+":"+password); } private Person(List<?> list){ for(int i=0;i<list.size();i++){ System.out.println("person "+list.get(i)); } } public void aa1(){ System.out.println("aa1"); } public void aa1(String name,int password){ System.out.println("aa1 "+name+":"+password); } public Class[] aa1(String name,int[] password){ return new Class[]{String.class}; } private void aa1(InputStream in){ System.out.println(in); } public static void aa1(int num){ System.out.println(num); } public static void main(String[] args){ System.out.println("main"); for(int i=0;i<args.length;i++){ System.out.println(args[i]); } } }
2,反射测试类
package reflect; import java.io.FileInputStream; import java.io.InputStream; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * java反射 * 加载类三种方式: * 1、Class c=Class.forName("reflect.Person"); * 2、Class c=new Person().getClass(); * 3、Class c=Person.class; * */ public class DemoTest { /** * 调无参构造 */ @Test public void constructor1() throws Exception{ Class c=Class.forName("reflect.Person"); Constructor cs=c.getConstructor(null);//null表示无参构造,null也可以不写 Person p=(Person) cs.newInstance(null);//调用无参构造函数创建实例,null可以不写 System.out.println(p.name); } /** * 调有参构造Person(String name) */ @Test public void constructor2() throws Exception{ Class c=Class.forName("reflect.Person"); Constructor cs=c.getConstructor(String.class);//创建有参构造,参数类型为String Person p=(Person) cs.newInstance("xxxx");//调用Person(String name)构造创建实例,xxxx可为任意字符串 System.out.println(p.name); } /** * 调有参构造Person(String name,int password) */ @Test public void constructor3() throws Exception{ Class c=Class.forName("reflect.Person"); Constructor cs=c.getConstructor(String.class,int.class);//创建有参构造,参数类型为String,int Person p=(Person) cs.newInstance("xxxx",11);//调用Person(String name,int password)构造创建实例,xxxx可为任意字符串,11可为任意数字 System.out.println(p.name); } /** * 调私有构造private Person(List list) * 理论上私有方法外部类不可以访问,但是反射可以做到 */ @Test public void constructor4() throws Exception{ List<String> list=new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); Class c=Class.forName("reflect.Person"); Constructor cs=c.getDeclaredConstructor(List.class);//私有构造用getDeclaredConstructor获取 cs.setAccessible(true);//爆力反射,可以访问私有方法 Person p=(Person) cs.newInstance(list); System.out.println(p.name); } /** * 无参构造第二种调用方式 */ @Test public void constructor5() throws Exception{ Class c=Class.forName("reflect.Person"); Person p=(Person) c.newInstance(); System.out.println(p.name); } /** * 调public void aa1()方法 */ @Test public void method1() throws Exception{ Person person=new Person(); Class c=Class.forName("reflect.Person"); Method method=c.getMethod("aa1", null);//访问aa1方法,参数为null method.invoke(person, null);//指定调哪个对象的方法,参数为null } /** * 调public void aa1(String name,int password)方法 */ @Test public void method2() throws Exception{ Person person=new Person(); Class c=Class.forName("reflect.Person"); Method method=c.getMethod("aa1", String.class,int.class); method.invoke(person, "TOM",32); } /** * 调public Class[] aa1(String name,int[] password)方法 */ @Test public void method3() throws Exception{ Person person=new Person(); Class c=Class.forName("reflect.Person"); Method method=c.getMethod("aa1", String.class,int[].class); Class[] cs=(Class[]) method.invoke(person,"Jack", new int[]{1,23}); System.out.println(cs[0]); } /** * 调private void aa1(InputStream in)方法 */ @Test public void method4() throws Exception{ Person person=new Person(); InputStream is=new FileInputStream("D:\\work\\struts2\\src\\struts.xml"); Class c=Class.forName("reflect.Person"); Method method=c.getDeclaredMethod("aa1", InputStream.class);//访问私有方法用getDeclaredMethod method.setAccessible(true); method.invoke(person, is); } /** * 调public static void aa1(int num) */ @Test public void method5() throws Exception{ Class c=Class.forName("reflect.Person"); Method method=c.getMethod("aa1", int.class);//访问私有方法用getDeclaredMethod method.invoke(null, 23);//静态方法调用不需要传对象 } /** * 反射创建实例并调用方法 */ @Test public void method6() throws Exception{ Class c=Class.forName("reflect.Person"); Constructor cs=c.getConstructor(null); Person p=(Person) cs.newInstance(null); Method m=c.getMethod("aa1", String.class,int.class); m.invoke(p, "Lucy",45); } /** * 反射调main方法 */ @Test public void method7() throws Exception{ Class c=Class.forName("reflect.Person"); Method method=c.getMethod("main", String[].class); //method.invoke(null, new Object[]{new String[]{"aaa","bbb"}});//这里和其他方法不同,比较奇葩,两种调用方式 method.invoke(null, (Object)new String[]{"aaa","bbb"}); } /** * 反射字段属性 public String name="aaaaa"; */ @Test public void property1() throws Exception{ Person person=new Person(); Class c=Class.forName("reflect.Person"); Field field = c.getField("name");//获取名为"name"的字段 Class<?> type = field.getType(); System.out.println(type);//得到字段类型 String name=(String) field.get(person); System.out.println(name);//得到字段值 //Object value=field.get(person); //Class<?> type2 = field.getType(); //if(String.class.equals(type2)){ // String sValue=(String)value; // System.out.println(sValue); //} field.set(person, "bbbb");//给该字段赋值为bbbb System.out.println(person.name); } /** * 反射私有属性private int password; */ @Test public void property2() throws Exception{ Person person=new Person(); Class c=Class.forName("reflect.Person"); Field field = c.getDeclaredField("password"); field.setAccessible(true); field.set(person, 123456); int password = (Integer) field.get(person); System.out.println(password); } /** * 反射私有静态属性private static int age; */ @Test public void property3() throws Exception{ Class c=Class.forName("reflect.Person"); Field field = c.getDeclaredField("age"); field.setAccessible(true); field.set(null, 87); int age = (Integer) field.get(null); System.out.println(age); } }
发表评论
-
java
2022-11-02 11:24 1192package com.example.poi; i ... -
java
2022-11-02 10:52 1062package com.example.poi; i ... -
获取java系统级参数
2015-12-05 21:13 799package system; import jav ... -
ClassUtils
2015-11-13 13:59 658package test; import inter ... -
java时间相减
2015-05-24 15:15 710/** * 时间相减 */ public ... -
java获取鼠标当前位置
2015-01-30 12:27 1484方法一: package window; impor ... -
nio与io拷贝文件性能对比
2015-01-27 17:25 783package my; import java.io ... -
nio与io的区别
2015-01-18 08:47 551传统的socket IO中,需要为每个连接创建一个线程,当并发 ... -
子线程先执行和主线程交替执行
2015-01-16 17:08 838package thread.tongbu; /** ... -
java发邮件实例
2014-12-27 19:12 1128首先导入附件中的mail.jar和activation.jar ...
相关推荐
在提供的"java反射实例代码"中,应该包含了如何使用上述方法的实际示例,这些示例有助于加深对Java反射机制的理解。通过阅读和运行这些代码,开发者可以更直观地学习如何在程序运行时动态地操作类、方法和字段,从而...
Java反射是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够在运行时创建和访问这些类的对象。在Java中,反射提供了对类对象的元数据(metadata)的访问,使得我们可以...
标题"Java反射实例源码"表明我们将探讨如何通过源代码来实现和理解Java反射。这个实例可能包含了如何动态地创建对象、调用方法、访问字段和执行构造器的示例。 描述中提到的博客文章"菜鸟学编程(九)——Java反射...
在标题和描述中提到的"java反射实例"是一个简单的入门程序,旨在演示如何使用反射来操作JavaBean的get和set方法。 首先,让我们理解JavaBean。JavaBean是一种符合特定规范的Java类,通常具有公有的getter和setter...
以下是对"Java反射实例"的详细解释: 1. **获取Class对象** 要使用反射,首先需要获取到对应的`Class`对象。这可以通过以下三种方式实现: - 使用`Class.forName()`方法,传入类的全名(包括包名)。 - 对象的`...
以下将详细介绍Java反射的8个关键实例。 1. 获取Class对象 要使用反射,首先需要获取到目标类的Class对象。这可以通过以下几种方式实现: - 使用`Class.forName()`方法,如`Class<?> clazz = Class.forName("全...
java 反射 的 实例介绍 个人笔记
很好的几个反射的例子,看后就明白什么是反射了,反射机制怎么用了
关于Java反射的实例,我们可以创建一个简单的例子。假设我们有一个接口`Service`和两个实现类`ServiceImpl1`、`ServiceImpl2`。在不使用反射的情况下,我们通常会通过new关键字创建服务对象。而通过反射,可以在运行...
三、Java反射实例 1. 创建对象:通过`Class.newInstance()`创建默认构造器的对象,或`Constructor.newInstance()`创建指定构造器的对象。 ```java Class<?> clazz = Class.forName("com.example.MyClass"); MyClass ...
本实例将深入探讨Java反射的应用及其重要性。 一、什么是Java反射 Java反射机制允许我们动态地获取类的信息,并在运行时创建和调用对象的方法。这种能力使得Java具有高度的灵活性和动态性,特别是在处理跨版本兼容...
在本“Java反射经典实例”中,我们将深入探讨这个主题,了解如何利用反射来访问和修改私有属性以及调用私有方法。 1. **反射的概念与用途** - 反射机制是在运行时分析类的能力,它允许我们获取类的信息(如类名、...
### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...
### Java反射机制简介 Java反射机制是Java编程语言的一个强大特性,它允许程序在运行时检查自身,并且能够“看”到类的信息(字段、方法等),甚至可以在运行时调用这些方法或修改这些字段的值。这为开发带来了很大...
Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法...
Java 反射机制详解 Java 反射机制是 Java 语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并进行操作。这种能力使得 Java 应用程序更加灵活,能够在运行时发现和修改自身...