java反射技术

一.反射获取对象

1.获取字节码文件的三种方式

Class.forName("类的全路径")
对象.getClass()
类名.class

2.获取构造方法的api

		Class clazz=Student.class;
		Constructor c = clazz.getDeclaredConstructor(boolean.class);//获取某个指定的构造方法(包括私有构造)
		Constructor[] constructors = clazz.getDeclaredConstructors();//获取所有的构造方法(包括私有构造)
		Constructor[] constructors2 = clazz.getConstructors();//获取所有的构造方法(不包括私有构造)
		Constructor constructor = clazz.getConstructor(null);//获取某个指定的构造方法(不包括私有构造)
<span style="white-space:pre">		</span>//如果是无参构造的话,参数可以给null,或者不给<span style="font-family: Arial, Helvetica, sans-serif;">			</span>
		Constructor c = clazz.getDeclaredConstructor();
		Constructor constructor = clazz.getConstructor();

3.构造方法调用newInstance(Object....obj),来获取到对象实例

		c.setAccessible(true);//若果获取到的是private的构造,需要暴力反射设置为true
		c.newInstance(true)<span style="font-family: Arial, Helvetica, sans-serif;">;//clazz..newInstance()默认调用的是类中的无参构造来获取实例对象的</span>


二.反射获取方法

public class Demo2Method {
	/*
	 * 与操作方法相关的方法:
	 *  Method getMethod(String name, Class<?>... parameterTypes)  第一个参数:方法,第二个参数:参数类型或个数。
	 *  	得到指定的公共方法。
 		Method[] getMethods() 返回一个包含某些 Method 对象的数组,得到所有公共方法(包括父类或父接口的公共方法)。 

		 Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
          	得到指定的方法。
 		Method[] getDeclaredMethods() 
          		返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 
Method对象的方法:
	Object invoke(Object obj, Object... args) //此方法代表要执行的方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
          对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 
	 * */
	
	@Test //public void m1()
	public void test1() throws Exception{
		//Student stu = new Student();
		Class clazz = Student.class;
		Method m = clazz.getMethod("m1");
		m.invoke(clazz.newInstance(), null);  //此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
	}
	
	@Test //public void m2(String name)
	public void test2() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m2",String.class);
		m.invoke(clazz.newInstance(), "tom");  //此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
	}
	
	@Test //public String m3(String name){
	public void test3() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m3",String.class);
		Object o = m.invoke(clazz.newInstance(), "tom");  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
		
		System.out.println(o);
	}
	
	@Test //private void m4(int age)
	public void test4() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getDeclaredMethod("m4",int.class);
		m.setAccessible(true);
		m.invoke(clazz.newInstance(), 18);  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
	}
	
	@Test //public static void m5(String name,int age)
	public void test5() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m5",String.class,int.class);
		m.invoke(null, "tom",18);  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
	}
	
	@Test //public static void m6(String[] args){
	public void test6() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m6",String[].class);
		//m.invoke(null,new Object[]{new String[]{"tom","jerry","aaa"}});  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
		m.invoke(null,(Object)new String[]{"tom","jerry","aaa"});
	}
	
	@Test //提到所有方法
	public void test7() throws Exception{
		Class clazz = Student.class;
		Method[] ms = clazz.getMethods();//得到所有公共的方法
		System.out.println(ms.length);
	}
	
	@Test //提到所有方法
	public void test8() throws Exception{
		Class clazz = Student.class;
		Method[] ms = clazz.getDeclaredMethods();//得到当前类所有方法
		System.out.println(ms.length);
	}
}


三.反射获取字段(成员变量)

public class Demo3Field {
	/*
	 *  Field getField(String name) 
          		返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 
 		Field[] getFields() 
          		返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 

		Field getDeclaredField(String name) 
          		返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 
 		Field[] getDeclaredFields() 
          	返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 
 Field对象的方法:
 
 	Object get(Object obj)  返回指定对象上此 Field 表示的字段的值。 
 	void set(Object obj, Object value) 给第一个参数所表示的对象,赋值(第二个参数) 
	 * */
	@Test   //给操作公共变量name
	public void test1() throws Exception{
		Student stu = new Student();
		Class clazz = Student.class;
		Field f = clazz.getField("name");
		System.out.println(f.get(stu));
		
		f.set(stu, "李四");
		
		Field f1 = clazz.getField("name");
		System.out.println(f1.get(stu));
	}
	
	@Test   //给操作私有变量age
	public void test2() throws Exception{
		Student stu = new Student();
		Class clazz = Student.class;
		Field f = clazz.getDeclaredField("age");
		f.setAccessible(true);
		f.set(stu,18);
		
		/*Field f1 = clazz.getDeclaredField("age");
		f1.setAccessible(true);*/
		System.out.println(f.get(stu));
	}
	
	@Test   //给操作私有变量age
	public void test3() throws Exception{
		Student stu = new Student();
		Class clazz = Student.class;
		//Field f = clazz.getDeclaredField("name");
		Field[] fs = clazz.getDeclaredFields();
		for (Field f : fs) {
			System.out.println(Modifier.toString(f.getModifiers())+"\t"+f.getType().getSimpleName()+"\t"+  f.getName());
		}
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值