Java Web:Java.lang,反射调用,获取类的对应的Class对象,属性,构造方法【诗书画唱】





例子START
反射调用student中的方法对象start


import java.lang.reflect.Method;
public class Demo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//反射调用方法
Class cls = Class.forName("com.SSHC.bean.Student");
//通过反射创建一个Student对象
//Student s = new Student();
Object s = cls.newInstance();//类型擦除
//获取study方法对象
Method m1 = cls.getDeclaredMethod("study");
//反射调用
//s.study();
m1.invoke(s);
//获取buy方法对象
//s.buy("西游记",88.0);
Method m2 = cls.getDeclaredMethod("buy"
, String.class, Double.class);
m2.invoke(s, "西游记", 88.0);
//获取exam方法对象
Method m3 = cls.getDeclaredMethod("exam");
//Integer a = s.exam();
Object a = m3.invoke(s);
System.out.println(a);
//获取help方法对象
Method m4 = cls.getDeclaredMethod("help", String.class);
//String str = s.help("红楼梦");
Object str = m4.invoke(s, "红楼梦");
System.out.println(str);
}
}


package com.SSHC.bean;
public class Student {
private String name;
private Integer age;
private String sex;
public Student(){
}
public Student(String n){
this.name = n;
}
public Student(String n,Integer a){
this.name = n;
this.age = a;
}
//没有参数没有返回值的方法
public void study(){
System.out.println("正在学习");
}
//有参数没有返回值的方法
public void buy(String bname,Double price){
System.out.println("买了一个书,书名是:" + bname);
}
//没有参数有返回值的方法
public Integer exam(){
return 98;
}
//有参数有返回值的方法
public String help(String name){
return "《" + name + "》";
}
}


反射调用student中的方法对象end
输入一个类名,输入一个方法名,反射调用方法(如eat方法) START

import java.lang.reflect.Method;
public class Tt {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
//输入一个类名,输入一个方法名,反射调用方法
String methodName = "eat";
String clsName = "com.SSHC.bean.Dog";
Class cls = Class.forName(clsName);
//创建一个Student对象
Object stu = cls.newInstance();
//获取方法对象
Method m = cls.getDeclaredMethod(methodName);
m.invoke(stu);
}
}


package com.SSHC.bean;
public class Dog {
public void eat(){
System.out.println("正在吃东西");
}
}


输入一个类名,输入一个方法名,反射调用方法END
获取String类中的所有的构造方法START

package com.SSHC.bean;
public class Student {
private String name;
private Integer age;
private String sex;
public Student(){
}
public Student(String n){
this.name = n;
}
public Student(String n,Integer a){
this.name = n;
this.age = a;
}
//没有参数没有返回值的方法
public void study(){
System.out.println("正在学习");
}
//有参数没有返回值的方法
public void buy(String bname,Double price){
System.out.println("买了一个书,书名是:" + bname);
}
//没有参数有返回值的方法
public Integer exam(){
return 98;
}
//有参数有返回值的方法
public String help(String name){
return "《" + name + "》";
}
}


package TEXT;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//获取Student类的对应的Class对象
// Student s = new Student();
// //方法一:
// Class c1 = s.getClass();
// //方法二:
// Class c2 = Student.class;
//方法三:
try {
Class c3 = Class.forName("com.SSHC.bean.Student");
//通过反射获取指定类的所有属性Field
Field[]fs = c3.getDeclaredFields();
// for(int i = 0;i < fs.length;i ++) {
// //取出每个属性
// Field f = fs[i];
// //获取每个属性的名和类型
// String fn = f.getName();
// System.out.println(fn);
// Class ft = f.getType();
// System.out.println(ft.getName());
// }
//java.util.Date类有哪些属性
// Class c = Class.forName("java.util.Date");
// Field[]f1 = c.getDeclaredFields();
// for(int i = 0;i < f1.length;i ++) {
// Field f = f1[i];
// System.out.println(f.getName());
// Class ft = f.getType();
// System.out.println(ft.getName());
// }
//获取Student类中的所有方法Method
// Method[]ms = c3.getDeclaredMethods();
// for(int i = 0;i < ms.length;i ++) {
// //获取类中的每个方法
// Method m = ms[i];
// //获取方法名
// String mn = m.getName();
// System.out.println(mn);
// //获取返回类型
// Class mc = m.getReturnType();
// //System.out.println(mc.getName());
// //方法参数列表的类型
// Class[]mps = m.getParameterTypes();
// for(int j = 0;j < mps.length;j ++) {
// //取出每个方法中的单个参数
// Class mpc = mps[j];
// System.out.println("参数类型是:" + mpc.getName());
// }
// }
//获取Student类中所有的构造方法Constructor
// Constructor[]cs = c3.getDeclaredConstructors();
// for(int i = 0;i < cs.length;i ++) {
// //获取每个构造方法
// Constructor ct = cs[i];
// //获取构造方法的参数类型
// Class[]cfs = ct.getParameterTypes();
// System.out.println("第" + i + "个构造方法的参数列表:");
// for(int j = 0;j < cfs.length;j ++) {
// Class cc = cfs[j];
// System.out.println(cc.getName());
// }
// }
//获取String类中的所有的构造方法
Class ck = Class.forName("java.lang.String");
Constructor []cks = ck.getDeclaredConstructors();
for(int i = 0;i < cks.length;i ++) {
Constructor ct = cks[i];
System.out.println("第" + (i + 1) + "个构造方法的参数:");
Class[]cfs = ct.getParameterTypes();
for(int j = 0;j < cfs.length;j ++) {
//取出每个参数
Class cfc = cfs[j];
System.out.println(cfc.getName());
}
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


获取String类中的所有的构造方法END
获取Student类中所有的构造方法Constructor START
//获取Student类中所有的构造方法Constructor
Constructor[]cs = c3.getDeclaredConstructors();
for(int i = 0;i < cs.length;i ++) {
//获取每个构造方法
Constructor ct = cs[i];
//获取构造方法的参数类型
Class[]cfs = ct.getParameterTypes();
System.out.println("第" + i + "个构造方法的参数列表:");
for(int j = 0;j < cfs.length;j ++) {
Class cc = cfs[j];
System.out.println(cc.getName());
}
}


获取Student类中所有的构造方法Constructor END
获取Student类中的所有方法Method START
//获取Student类中的所有方法Method
Method[]ms = c3.getDeclaredMethods();
for(int i = 0;i < ms.length;i ++) {
//获取类中的每个方法
Method m = ms[i];
//获取方法名
String mn = m.getName();
System.out.println(mn);
//获取返回类型
Class mc = m.getReturnType();
//System.out.println(mc.getName());
//方法参数列表的类型
Class[]mps = m.getParameterTypes();
for(int j = 0;j < mps.length;j ++) {
//取出每个方法中的单个参数
Class mpc = mps[j];
System.out.println("参数类型是:" + mpc.getName());
}
}


获取Student类中的所有方法Method END
通过反射获取指定类的所有属性Field START
Class c3 = Class.forName("com.SSHC.bean.Student");
//通过反射获取指定类的所有属性Field
Field[]fs = c3.getDeclaredFields();
for(int i = 0;i < fs.length;i ++) {
//取出每个属性
Field f = fs[i];
//获取每个属性的名和类型
String fn = f.getName();
System.out.println(fn);
Class ft = f.getType();
System.out.println(ft.getName());
}


通过反射获取指定类的所有属性Field END
java.util.Date类有哪些属性 START
//java.util.Date类有哪些属性
Class c = Class.forName("java.util.Date");
Field[]f1 = c.getDeclaredFields();
for(int i = 0;i < f1.length;i ++) {
Field f = f1[i];
System.out.println(f.getName());
Class ft = f.getType();
System.out.println(ft.getName());
}


java.util.Date类有哪些属性 END
例子END
反射PPT START




反射PPT END
Java.lang PPT START


















Java.lang PPT END
讲义 START

一、Class类
二、反射
小红,19岁,女
小明,20岁,男
小华,20岁,女
姓名年龄和性别,创建出一个Student,包含有姓名学生和年龄
Student,study方法,eat方法,姓名年龄和性别
Cat,play方法,eat方法,毛色品种
Car,run方法,repared方法,品牌价格颜色
类名方法数组和属性数组
创建一个Class类,包含类名,方法列表和属性列表,继承自谁
java类的使用说明书,如果需要了解一个指定的类,就需要获取到指定类的使用说明书
如果想了解某一个类包含有哪些方法和属性以及继承自谁,那么就可以直接获取当前这个类对应的Class对象就可以了
如果需要使用反射技术,就必须要先获取类的Class对象
为什么不想在程序中使用过多的import语句?
方法中没有包含构造方法。