5分彩平台客服_Java反射的常见用法

  • 时间:
  • 浏览:0
  • 来源:吉林新闻网_吉林主流媒体_吉林门户网站

    反射的常见用法有三类,第一类是“查看”,比如输入某个类的属性最好的法律法律法律依据等信息,第二类是“装载“,比如装载指定的类到内存里,第三类是“调用”,比如通过传入参数,调用指定的最好的法律法律法律依据。

1 查看属性的修饰符、类型和名字

    通过反射机制,人们歌词 人们歌词 人们歌词 人们歌词 能从.class文件里看完指定类的属性,比如属性的修饰符,属性和类型和属性的变量名。通过下面的ReflectionReadVar.java,人们歌词 人们歌词 人们歌词 人们歌词 看演示下具体的做法。    

1	import java.lang.reflect.Field;
2	import java.lang.reflect.Modifier;
3	class MyValClass{
4		private int val1;
5		public String val2;
6		final protected String val3 = "Java";

    人们歌词 人们歌词 人们歌词 人们歌词 在第3行定义了十几个 多多MyValCalss的类,并在第4到第6行里,定义了十几个 多多属性变量。    

8	public class ReflectionReadVar {
9		public static void main(String[] args) {
10			Class<MyValClass> clazz = MyValClass.class;
11			//获取你你这种类的所有属性
12	        Field[] fields = clazz.getDeclaredFields();
13		    for(Field field : fields) {
14		    	   //输出修饰符	    	   System.out.print(Modifier.toString(field.getModifiers()) + "\t");
15		    	   //输出属性的类型
16		       System.out.print(field.getGenericType().toString() + "\t");
17		    	   //输出属性的名字
18		    	   System.out.println(field.getName());
19		      }
20		}
21	}

    在main函数的第10行里,通过MyValClass.class,得到了Class<MyValClass>类型的变量clazz,在你你这种变量中,存储了MyValClass你你这种类的很多很多信息。

    在第12行里,通过了clazz.getDeclaredFields()最好的法律法律法律依据得到了MyValClass类里的所有属性的信息,并把你你这种属性的信息存入到Field数组类型的fields变量里。

    通过了第13行的for循环依次输出了你你这种属性信息。具体来讲,通过第14行的代码输出了该属性的修饰符,通过第16行的代码输出了该属性的类型,通过第18行的代码输出了该属性的变量名。这段代码的输出如下,从中人们歌词 人们歌词 人们歌词 人们歌词 能看完各属性的信息。

          1      private    int val1

          2      public class java.lang.String   val2

          3      protected final   class java.lang.String   val3   

2 查看最好的法律法律法律依据的返回类型,参数和名字

    通过ReflectionReadFunc.java,人们歌词 人们歌词 人们歌词 人们歌词 能通过反射机制看完指定类的最好的法律法律法律依据。    

1	import java.lang.reflect.Constructor;
2	import java.lang.reflect.Method;
3	class MyFuncClass{
4		public MyFuncClass(){}
5		public MyFuncClass(int i){}
6		private void f1(){}
7		protected int f2(int i){return 0;}
8		public String f2(String s) {return "Java";}

    在第3行定义的MyFuncClass你你这种类里,人们歌词 人们歌词 人们歌词 人们歌词 定义了十几个 多多构造函数和5个最好的法律法律法律依据。 

10	public class ReflectionReadFunc {
11		public static void main(String[] args) {
12			Class<MyFuncClass> clazz = MyFuncClass.class;
13	        Method[] methods = clazz.getDeclaredMethods();
14	        for (Method method : methods) 
15	        { System.out.println(method); }
16	        //得到所有的构造函数
17	        Constructor[] c1 = clazz.getDeclaredConstructors();
18	        //输出所有的构造函数
19	        for(Constructor ct : c1)
20	        { System.out.println(ct);  }
21		}
22	}

    在main函数的第12行,人们歌词 人们歌词 人们歌词 人们歌词 同样是通过了类名.class的最好的法律法律法律依据(也或者 MyFuncClass.class的最好的法律法律法律依据)得到了Class<MyFuncClass>类型的clazz对象。

    在第13行里,是通过了getDeclaredMethods最好的法律法律法律依据得到了MyFuncClass类的所有最好的法律法律法律依据,并在第14行的for循环里输出了各最好的法律法律法律依据。在第17行里,是通过了getDeclaredConstructors最好的法律法律法律依据得到了所有的构造函数,并通过第19行的循环输出。

    本代码的输出结果如下所示,其中第1到第3行输出的是类的最好的法律法律法律依据,第4和第5行输出的是类的构造函数。    

1	private void MyFuncClass.f1()
2	protected int MyFuncClass.f2(int)
3	public java.lang.String MyFuncClass.f2(java.lang.String)
4	public MyFuncClass()
5	public MyFuncClass(int)

    不过在实际的项目里,人们歌词 人们歌词 人们歌词 人们歌词 一般不需要仅仅“查看”类的属性和最好的法律法律法律依据,在更多的情况报告里,人们歌词 人们歌词 人们歌词 人们歌词 是通过反射装载和调用类里的最好的法律法律法律依据。

3 通过forName和newInstance最好的法律法律法律依据加载类

    在前文JDBC操作数据库的代码里,人们歌词 人们歌词 人们歌词 人们歌词 看完在创建数据库连接对象(Connection)后后,需用通过Class.forName("com.mysql.jdbc.Driver");的代码来装载数据库(这里是MySQL)的驱动。

    都需用说,Class类的forName最好的法律法律法律依据最常见的用法或者 装载数据库的驱动,以至于不少人会错误地认为你你这种最好的法律法律法律依据的作用是“装载类”。

    并都是forName最好的法律法律法律依据的作用仅仅是返回十几个 多多Class类型的对象,它一般会和newInstance最好的法律法律法律依据配套使用,而newInstance最好的法律法律法律依据的作用才是加载类。

    通过下面的ForClassDemo.java这段代码,人们歌词 人们歌词 人们歌词 人们歌词 来看下综合使用forName和newInstance你这种个多多最好的法律法律法律依据加载对象的最好的法律法律法律依据。    

1	class MyClass{
2		public void print()
3		{	System.out.println("Java");	}
4	}
5	public class ForClassDemo {
6		public static void main(String[] args)	{
7	        //通过new创建类和使用类的最好的法律法律法律依据
8			MyClass myClassObj = new MyClass();
9			myClassObj.print();//输出是Java
10			//通过forName和newInstance加载类的最好的法律法律法律依据	
11			try {
12				Class<?> clazz = Class.forName("MyClass");
13				MyClass myClass = (MyClass)clazz.newInstance();
14				myClass.print();//输出是Java
15			} catch (ClassNotFoundException e) {
16				e.printStackTrace();
17			} catch (InstantiationException e) {
18				e.printStackTrace();
19			} catch (IllegalAccessException e) {
20				e.printStackTrace();
21			}		
22		}
23	}

    在第1行定义的MyClass你你这种类里,人们歌词 人们歌词 人们歌词 人们歌词 在其中的第2行定义了十几个 多多print最好的法律法律法律依据。

    Main函数的第8和第9行里,人们歌词 人们歌词 人们歌词 人们歌词 演示了通过常规new的最好的法律法律法律依据创建和使用类的最好的法律法律法律依据,通过第9行,人们歌词 人们歌词 人们歌词 人们歌词 能输出“Java”你你这种字符串。

    在第12行,人们歌词 人们歌词 人们歌词 人们歌词 通过Class.forName("MyClass")最好的法律法律法律依据返回了十几个 多多Class类型的对象,请注意,forName最好的法律法律法律依据的作用都是“加载MyClass类”,或者 返回十几个 多多带有 MyClass信息的Class类型的对象。这里人们歌词 人们歌词 人们歌词 人们歌词 是通过第13行的newInstance最好的法律法律法律依据,加载了十几个 多多MyClass类型的对象,并在第14行调用了其中的print最好的法律法律法律依据。

    既然forName最好的法律法律法律依据的作用仅仅是“返回Class类型的对象”,这麼 在JDBC累积的代码里,为你你这种人们歌词 人们歌词 人们歌词 人们歌词 能通过Class.forName("com.mysql.jdbc.Driver");代码来装载MySQL的驱动呢?在MySQL的com.mysql.jdbc.Driver驱动类带有 如下的一段静态初始化代码。   

1	static {
2	try {
3	   java.sql.DriverManager.registerDriver(new Driver());
4	} catch (SQLException e) {
5	throw new RuntimeException(“Can’t register driver!”);
6	}
7	}

    也或者 说,人们歌词 人们歌词 人们歌词 人们歌词 人们歌词 调用Class.forName最好的法律法律法律依据后,会通过执行这段代码会新建十几个 多多Driver的对象,并调用第3行的DriverManager.registerDriver把刚创建的Driver对象注册到DriverManager里。

    在上述的代码里,人们歌词 人们歌词 人们歌词 人们歌词 看完了除了new之外,人们歌词 人们歌词 人们歌词 人们歌词 还能通过newInstance来创建对象。

    并都是这里说“创建”从不准确,并都是说通过new和newInstance人们歌词 人们歌词 人们歌词 人们歌词 都能得到十几个 多多可用的对象,但newInstance的作用并都是是通过Java虚拟机的类加载机制把指定的类加载到内存里。

    人们歌词 人们歌词 人们歌词 人们歌词 在工厂模式中,老要会通过newInstance最好的法律法律法律依据来加载类,但你你这种最好的法律法律法律依据非可是我 通过调用类的无参构造函数来加载类,后后人们歌词 人们歌词 人们歌词 人们歌词 在创建对象需用用传入参数,这麼 就得使用new来调用对应的带参的构造函数了。

4 通过反射机制调用类的最好的法律法律法律依据

    后后人们歌词 人们歌词 人们歌词 人们歌词 通过反射机制来调用类的最好的法律法律法律依据,这麼 就得出理 十几个 多多疑问,第一,通过你你这种最好的法律法律法律依据来调?第二,何如传入参数,第三,何如得到返回结果?

    通过下面的CallFuncDemo.java代码,人们歌词 人们歌词 人们歌词 人们歌词 将通过反射来调用类里的最好的法律法律法律依据,在其中人们歌词 人们歌词 人们歌词 人们歌词 能看下上述十几个 多多疑问的出理 最好的法律法律法律依据。    

1	import java.lang.reflect.Constructor;
2	import java.lang.reflect.InvocationTargetException;
3	import java.lang.reflect.Method;
4	class Person {
5		private String name;
6		public Person(String name) 
7	    {this.name = name;}
8		public void saySkill(String skill) {
9		  System.out.println("Name is:"+name+",skill is:" + skill);
10		}
11		public int addSalary(int current) 
12	    {	return current + 50;}
13	}

    在第4行里,人们歌词 人们歌词 人们歌词 人们歌词 定义了十几个 多多Person类,在其中的第6行里,人们歌词 人们歌词 人们歌词 人们歌词 定义了十几个 多多带参的构造函数,在第8行里,人们歌词 人们歌词 人们歌词 人们歌词 定义了十几个 多多带参但无返回值得saySkill最好的法律法律法律依据,在第11行里,人们歌词 人们歌词 人们歌词 人们歌词 定义了十几个 多多带参或者 返回int类型的addSalary最好的法律法律法律依据。    

14	public class CallFuncDemo {
15		public static void main(String[] args) {
16			Class c1azz = null;
17			Constructor c = null;
18			try {
19				c1azz = Class.forName("Person");
20				c = c1azz.getDeclaredConstructor(String.class);
21				Person p = (Person)c.newInstance("Peter");
22				//output: Name is:Peter, skill is:java
23				p.saySkill("Java");
24				// 调用最好的法律法律法律依据,需用传递对象实例,一块儿传递参数值
25				Method method1 = c1azz.getMethod("saySkill", String.class);
26				//后后没返回值,很多很多很多很多能直接调
27				//输出结果是Name is:Peter, skill is:C#
28	            method1.invoke(p, "C#");             
29	            Method method2 = c1azz.getMethod("addSalary", int.class);
50	            Object invoke = method2.invoke(p, 50);
31	            //输出50
32				System.out.println(invoke);
33			} catch (ClassNotFoundException e) {
34				e.printStackTrace();
35			} catch (NoSuchMethodException e1) {
36				e1.printStackTrace();
37			} catch (InstantiationException e) {
38				e.printStackTrace();
39			} catch (IllegalAccessException e) {
40				e.printStackTrace();
41			} catch (InvocationTargetException e) {
42				e.printStackTrace();
43			}
44		}
45	}

    在第19行里,人们歌词 人们歌词 人们歌词 人们歌词 通过Class.forName得到了十几个 多多Class类型的对象,其带有 晒 了Person类的信息。在第20行里,通过传入String.class参数,得到了Person类的带参的构造函数,并通过了第21行的newInstance最好的法律法律法律依据,通过你你这种带参的构造函数创建了十几个 多多Person类型的对象。可是我 在第23行里调用了saySkill最好的法律法律法律依据。这里人们歌词 人们歌词 人们歌词 人们歌词 演示通过反射调用类的构造函数来创建对象的最好的法律法律法律依据。

    在第25行里,人们歌词 人们歌词 人们歌词 人们歌词 通过了getMethod最好的法律法律法律依据,得到了带参的saySkill最好的法律法律法律依据的Method类型的对象,可是我 通过第28行的invoke最好的法律法律法律依据调用了你你这种saySkill最好的法律法律法律依据,这里第十几个 多多参数是由哪个对象来调用,通过第5个参数,人们歌词 人们歌词 人们歌词 人们歌词 传入了saySkill最好的法律法律法律依据的String类型的参数。

    用同样的最好的法律法律法律依据,人们歌词 人们歌词 人们歌词 人们歌词 在第29和50行通过反射调用了Person类的addSalary最好的法律法律法律依据,后后你你这种最好的法律法律法律依据有返回值,很多很多很多很多人们歌词 人们歌词 人们歌词 人们歌词 在50行用了十几个 多多Object类型的invoke对象来接收返回值,通过第32行的打印语句,人们歌词 人们歌词 人们歌词 人们歌词 能看完50你你这种执行结果。

猜你喜欢

极速一分快三怎么玩_加油宝理财:严把互联网金融安全风险关

 作为以前成立一年的国内领先的“消费折扣+资金增值”二合一创新平台加油宝联合创始人乔小川,对加油宝未来的发展及风控非常看好。乔小川的自信首先来源于自身的实力。加油宝从互联网消费

2020-02-27

秒秒快3app注册_2019Q1知识付费报告:产业规模保持高增速

知识付费将会从最初的线上课程扩展到各个领域,各大主流知识付费平台也逐渐探索出了较为稳定的盈利模式和打发明者者了自身头部产品,知识付费行业形成了秒秒快3app注册比较性成熟图片

2020-02-27

大发飞艇最新网站_《一头扎进》系列之Python+Selenium框架实战篇7

1.简介截止到上一篇文章为止,框架基本详细搭建完成。没办法 今天让让我们我们要做有哪些呢????聪明如你的小伙伴可能性是童鞋一定可能性猜到了,都测试完了,当然是要生成一份高端

2020-02-27

秒秒快3真假_曹骏蓝盈莹分手:做回朋友也许是当下最好的选择

10月21日,曹骏发文回应和蓝盈莹分手,做回朋友 ,表示愿因着是陪伴对方的时间不多:“但对工作拥算不算限热情的朋友 两人,陪伴彼此的时间没人少,做回朋友 你说什么是当下最

2020-02-27

10分飞艇口诀_2019年终总结 | 更新会迟到,但不会缺席

简介想了之后写这些 。工作有关的事,不太想写,毕竟敏感。之后发现,都前要说一说这些 年来的各种大事。关于工作语句:每季度绩效总要满分关于学习语句:豪情万丈的日更基本达到关于

2020-02-27