总结不易,记得关注 !!!
re.properties:配置文件:
classfullpath=com.hspedu.Cat
method=cry
Cat类:
package com.hspedu;
public class Cat {
private String name="招财猫";
public int age=10;
public Cat() {//无参构造器
}
public Cat(String name) {
this.name = name;
}
public void hi(){
//System.out.println("hi "+name);
}
public void cry(){
System.out.println(name+" 喵喵叫..");
}
}
ReflectionQuestion类:
package com.hspedu.reflection.question;
import com.hspedu.Cat;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectionQuestion {
public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//根据配置文件,re.properties指定信息,创建Cat对象并调用方法hi
//传统方式
// Cat cat=new Cat();
// cat.hi();
//1.使用Properties类,可以读取配置文件
Properties properties=new Properties();
properties.load(new FileInputStream("src\\re.properties"));
String classfullpath = properties.get("classfullpath").toString();//类的全路径“com.hspedu.Cat”
String methodName = (String) properties.get("method");//方法“hi” 配置文件已改为cry
System.out.println("classfullpath="+classfullpath);//classfullpath=com.hspedu.Cat
System.out.println("method="+methodName);//method=cry
//2.创建对象
Cat cat2=new com.hspedu.Cat();
cat2.hi();
//Cat cat2=new classfullpath(); 错误的 new classfullpath是String 不是类名
//3.使用反射机制解决
//(1)加载类 返回Class类型的对象cls
Class cls = Class.forName(classfullpath); //Class类
System.out.println(cls);
//(2)通过cls 得到加载类的com.hspedu.Cat 的对象实例
Object o=cls.newInstance();//class com.hspedu.Cat
System.out.println(o);//com.hspedu.Cat@1540e19d
System.out.println("o运行类型="+o.getClass());//运行类型
//(3)通过cls得到加载的类com.hspedu.Cat的methodName(“hi”) 的方法对象 即在反射中可以把方法视为对象(万物皆对象)
Method method1 = cls.getMethod(methodName);
System.out.println("==============");
//(4)通过method1调用方法:即通过方法对象实现调用方法
method1.invoke(o);//传统方法 对象.方法() ,反射机制 方法.invoke(对象)
}
}
Java反射机制原理图:
Reflection01类:
package com.hspedu.reflection;
import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
public class Reflection01 {
public static void main(String[] args)throws Exception {
//1.使用Properties类,可以读取配置文件
Properties properties=new Properties();
properties.load(new FileInputStream("src\\re.properties"));
String classfullpath = properties.get("classfullpath").toString();//类的全路径“com.hspedu.Cat”
String methodName = (String) properties.get("method");//方法“hi”
//3.使用反射机制解决
//(1)加载类 返回Class类型的对象cls
Class cls = Class.forName(classfullpath); //Class类
//(2)通过cls 得到加载类的com.hspedu.Cat 的对象实例
Object o=cls.newInstance();
System.out.println(o);
System.out.println("o运行类型="+o.getClass());//运行类型
//(3)通过cls得到加载的类com.hspedu.Cat的methodName(“hi”) 的方法对象 即在反射中可以把方法视为对象(万物皆对象)
Method method1 = cls.getMethod(methodName);
System.out.println("==============");
//(4)通过method1调用方法:即通过方法对象实现调用方法
method1.invoke(o);//传统方法 对象.方法() ,反射机制 方法.invoke(对象)
//得到类成员变量
// java.lang.reflection.Fiels:代表类的成员变量,Filed对象代表某个类的成员变量
//得到name字段 getField不能得到私有的属性
//Field name = cls.getField("name");
Field ageField= cls.getField("age");//获得共有的age字段
System.out.println(ageField.get(o));//传统写法 对象.成员变量,反射:成员变量对象.get(对象)
//得到构造器
//java.lang.reflect.Constructor:代表类的构造方法,Constructor对象表示构造器
Constructor constructor=cls.getConstructor();//()中可以指定构造器的参数类型,没有写返回的是无参构造器
System.out.println(constructor);
Constructor constructor2 = cls.getConstructor(String.class);//String.class就是String类的Class对象
System.out.println(constructor2);
//得到构造器又可以帮我们构造对象
}
}
反射优化:
package com.hspedu.reflection;
import com.hspedu.Cat;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/*
测试反射调用的性能和优化方案
*/
public class Reflection02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
m1();
m2();
m3();
}
//传统方法调用hi
public static void m1(){
Cat cat=new Cat();
long start = System.currentTimeMillis();
for (int i = 0; i <90000000 ; i++) {
cat.hi();
}
long end = System.currentTimeMillis();
System.out.println("m1方法耗时="+(end-start));
}
//通过反射机制调用方法hi
public static void m2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//获取Class对象
Class cls = Class.forName("com.hspedu.Cat");
//通过cls对象new了一个实例
Object o=cls.newInstance();
//通过cls的到方法对象
Method hi = cls.getMethod("hi");
long start = System.currentTimeMillis();
for (int i = 0; i <90000000 ; i++) {
hi.invoke(o);//反射机制调用方法 通过Method调用o
}
long end = System.currentTimeMillis();
System.out.println("m2方法耗时="+(end-start));
}
//反射的优化:关闭访问检查
//通过反射机制调用方法hi
public static void m3() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//获取Class对象
Class cls = Class.forName("com.hspedu.Cat");
//通过cls对象new了一个实例
Object o=cls.newInstance();
//通过cls的到方法对象
Method hi = cls.getMethod("hi");
hi.setAccessible(true);//在反射调用方法时,取消访问机制,提高效率
long start = System.currentTimeMillis();
for (int i = 0; i <90000000 ; i++) {
hi.invoke(o);//反射机制调用方法 通过Method调用o
}
long end = System.currentTimeMillis();
System.out.println("m3方法耗时="+(end-start));
}
}
1.
2.
package com.hspedu.reflection.Class;
import com.hspedu.Cat;
/*
对Class类的梳理
*/
public class Class01 {
public static void main(String[] args) throws ClassNotFoundException {
//2.Class类不是new出来的,而是系统创建的
//(1)传统new对象
/*
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
*/
//Cat cat=new Cat();
//(2)反射方式
/*
ClassLoader类,仍然是通过ClassLoader加载Cat类的Class对象
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
*/
Class cls1=Class.forName("com.hspedu.Cat");
//3.对于某个类的Class对象,在内存只有一份,因为类只加载一次
Class cls2 = Class.forName("com.hspedu.Cat");
System.out.println(cls1.hashCode());//356573597
System.out.println(cls2.hashCode());//356573597,对应同一个对象相同说明是一个对象
Class cls3 = Class.forName("com.hspedu.Dog");
System.out.println(cls3.hashCode());//1735600054 Dog对应的一个Class对象
//
}
}
Dog类:
package com.hspedu;
public class Dog {
}
4.
Car类:
package com.hspedu;
public class Car {
public String brand="宝马";
public int price=500000;
public String color="白色";
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
", color='" + color + '\'' +
'}';
}
}
Class02类:
package com.hspedu.reflection.Class;
import com.hspedu.Car;
import com.hspedu.Cat;
import java.lang.reflect.Field;
/*
类的常用方法
*/
public class Class02 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
String classAllPath="com.hspedu.Car";
//获取Car类 对应的Class对象
//<?>表示不确定的Java类型
Class<?> cls=Class.forName(classAllPath);
//输出cls
System.out.println(cls);//class com.hspedu.Car显示cls对象,是哪个Class对象 com.hspedu.Car
System.out.println(cls.getClass());//class java.lang.Class,输出cls运行类型 java.lang.Class
//得到包名
System.out.println(cls.getPackage().getName());//com.hspedu
//得到类名
System.out.println(cls.getName());//com.hspedu.Car
//通过cls创建对象实例
Car car=(Car) cls.newInstance();
System.out.println(car);//调用car.toString() com.hspedu.Car@1540e19d Car{brand='宝马', price=500000, color='白色'}
//通过反射获取属性brand
Field brand = cls.getField("brand");
System.out.println(brand.get(car));//宝马
//给属性赋值
brand.set(car,"奔驰");
System.out.println(brand.get(car));//奔驰
//8我希望获取所有的属性
Field[] fileds=cls.getFields();
for (Field f:fileds){
System.out.println(f.getName());//名称
}
}
}
getClass类:
package com.hspedu.reflection.Class;
import com.hspedu.Car;
/*
得到Class的各种方式
*/
public class getClass {
public static void main(String[] args) throws ClassNotFoundException {
//1.Class.forName
String classAllPath="com.hspedu.Car";//全路径
Class<?> cls=Class.forName(classAllPath);
//输出cls
System.out.println(cls);//class com.hspedu.Car
//2.类名.Class 应用场景:用于参数传递
Class cls2= Car.class;
System.out.println(cls2);
//3.对象.getClass() 应用场景,有对象实例
Car car=new Car();
Class cls3=car.getClass();
System.out.println(cls3);
//4.通过类加载器【4】种,得到类的Class对象
//(1)先得到类加载器
ClassLoader classLoader=car.getClass().getClassLoader();
//(2)通过类的加载器获得Class对象
Class cls4=classLoader.loadClass(classAllPath);
System.out.println(cls4);
//cls1,cls2,cls3,cls4是同一个对象
//基本数据类型型(int char boolean,double,byte,short,long,short)按如下方式得到Class对象
Class<Integer> integerClass=int.class;
Class<Character> characterClass = char.class;
Class<Boolean> booleanClass = boolean.class;
System.out.println(integerClass);//int
//基本类型对应的包装类,可以通过 .TYPE 得到Class对象
Class<Integer> type = Integer.TYPE;
Class<Character> type1 = Character.TYPE;
System.out.println(type1);//char
System.out.println(integerClass.hashCode());//356573597
System.out.println(type.hashCode());//356573597
}
}
那些类型有Class对象?
AllTypeClass类:
package com.hspedu.reflection.Class;
import java.io.Serializable;
/*
那些类型有Class对象
*/
public class AllTyprClass {
public static void main(String[] args) {
Class<String> cls1 = String.class;//外部类
Class<Serializable> cls2 = Serializable.class;//接口
Class<Integer[]> cls3 = Integer[].class;//数组
Class<float[][]> cls4 = float[][].class;//二维数组
Class<Deprecated> cls5 = Deprecated.class;//注解
Class<Thread.State> cls6 = Thread.State.class;//枚举
Class<Long> cls7 = long.class;//基本数据类型
Class<Void> cls8 = void.class;//void
Class<Class> cls9 = Class.class;
System.out.println(cls1);
System.out.println(cls2);
System.out.println(cls3);
System.out.println(cls4);
System.out.println(cls5);
System.out.println(cls6);
System.out.println(cls7);
System.out.println(cls8);
System.out.println(cls9);
}
}
因为静态加载:注释Dog
编译通过
验证:文件的安全进行验证:文件描述符、源数据、字节码文件的安全性进行验证
准备:对静态变量进行默认初始化 ,并分配空间
解析:将符号引用转成直接引用
20会在加载的初始化阶段变为20
New 对象造成类加载
获取类的结构信息
ReflectionUtils.java
package com.hspedu.reflection;
import org.junit.Test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/*
通过反射获取类的结构信息
*/
public class ReflectionUtils {
public static void main(String[] args) {
}
//第二组API
@Test
public void api_02() throws ClassNotFoundException {
//1.得到类的Class对象
Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
//2.getName:获取全类名
System.out.println(personCls.getName());//com.hspedu.reflection.Person
//declaredField.getModifiers():获取该属性的修饰符值 规定默认修饰符 是0,public 是1,protected是4,static是8,final16
//declaredField.getType():这个属性类型对应的那个类的Class对象
//.getDeclaredFields:获取本类中所有的属性
Field[] declaredFields = personCls.getDeclaredFields();
for(Field declaredField:declaredFields){
System.out.println("本类中所有的属性:"+declaredField.getName()
+" 该属性的修饰符值="+declaredField.getModifiers()
+" 该属性的类型="+declaredField.getType());
}
//7.getDeclaredMethods:获取本类中的所有的方法
Method[] declaredMethods = personCls.getDeclaredMethods();
for (Method declaredMethod:declaredMethods){
System.out.println("本类中所有的方法="+declaredMethod.getName());
}
//declaredMethod.getModifiers():以int形式返回修饰符
//declaredMethod.getReturnType():以Class形式获取,返回类型
Method[] declaredMethods1 = personCls.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println("本类中所有的方法="+declaredMethod.getName()
+" 该方法的访问修饰符值="+declaredMethod.getModifiers()
+" 该方法返回类型"+declaredMethod.getReturnType());
//输出当前方法的参数数组情况
Class<?>[] parameterTypes = declaredMethod.getParameterTypes();
for (Class<?> parameterType : parameterTypes) {
System.out.println("该方法的形参类型="+parameterType);
}
}
//9.getDeclaredConstructors:获取本类中所有的构造器
Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println("本类中所有的构造器="+declaredConstructor.getName());
Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();
for (Class<?> parameterType : parameterTypes) {
System.out.println("改构造器的形参类型="+parameterType);
}
}
}
//第一组方法API
@Test
public void api_01() throws ClassNotFoundException {
//1.得到类的Class对象
Class<?> personCls = Class.forName("com.hspedu.reflection.Person");
//2.getName:获取全类名
System.out.println(personCls.getName());//com.hspedu.reflection.Person
//3.getSimpleName:获取简单的类名
System.out.println(personCls.getSimpleName());//Person
//4.getFields:获取所有public修饰的属性,包含本类以及父类的
Field[] fields = personCls.getFields();
for (Field field:fields){
System.out.println("本类以及父类的public属性"+field.getName());
}
//5.getDeclaredFields:获取本类中所有的属性
Field[] declaredFields = personCls.getDeclaredFields();
for(Field declaredField:declaredFields){
System.out.println("本类中所有的属性:"+declaredField.getName());
}
//6.getMethods:获取所有的public修饰的方法,包括本类以及父类
Method[] methods = personCls.getMethods();
for (Method method:methods){
System.out.println("本类以及父类的public方法:"+method.getName());
}
//7.getDeclaredMethods:获取本类中的所有的方法
Method[] declaredMethods = personCls.getDeclaredMethods();
for (Method declaredMethod:declaredMethods){
System.out.println("本类中所有的方法="+declaredMethod.getName());
}
//8.getConstructors:获取所有public修饰的构造器,包含本类
Constructor<?>[] constructors = personCls.getConstructors();
for (Constructor<?> constructor :constructors){
System.out.println("本类的构造器:"+constructor.getName());
}
//9.getDeclaredConstructors:获取本类中所有的构造器
Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println("本类中所有的构造器="+declaredConstructor.getName());
}
//10.getPackage:以Package形式返回包的信息
System.out.println(personCls.getPackage());//package com.hspedu.reflection
//11.getSupperClass:以Class形式返回父类信息
Class<?> superclass = personCls.getSuperclass();
System.out.println("父类的Class对象:"+superclass);//父类的Class:class com.hspedu.reflection.A
//12.getInterfaces:以及Class[] 形式返回接口的信息
Class<?>[] interfaces = personCls.getInterfaces();
for (Class<?> anInterface : interfaces) {
System.out.println("接口信息="+anInterface);
}
//13.getAnnotations:以Annotation[] 形式返回注解信息
Annotation[] annotations = personCls.getAnnotations();
for (Annotation annotation : annotations) {
System.out.println("注解信息="+annotation);
}
}
}
class A{
public String hobby;
public void hi(){
}
public A() {
}
}
interface IA{
}
interface IB{
}
@Deprecated //注解
class Person extends A implements IA,IB{
public String name;
protected static int age; //4+8=12
String job;
private double sal;
//构造器
public Person() {
}
public Person(String name) {
}
private Person(String name, int age) {
}
private void m1(String neme,int age,double sal){
}
protected String m2(){
return null;
}
void m3(){
}
private void m4(){
}
}
第一组API结果:
第二组API结果:
ReflecCreateInstance类:
package com.hspedu.reflection;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/*
反射机制创建实例
*/
public class ReflecCreateInstance {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//1.先获取到User类的Class对象
Class<?> userClass = Class.forName("com.hspedu.reflection.User");
//2.通过public的无参构造器创建实例
Object o = userClass.newInstance();
System.out.println(o);
//3.通过public的有参构造器创建实例
/*
带有形参的构造器,不能直接通过new Class兑对象来new Instace
必须:
1.得到对应的构造器
2.再去创建实例
constructor 对象就是
public User(String name) {
this.name = name;
}
*/
Constructor<?> constructor = userClass.getConstructor(String.class);//需要传入形参的对象
Object hsp = constructor.newInstance("hsp");
System.out.println("hsp="+hsp);
//4.通过private的有参构造器常见实例
Constructor<?> constructor1 = userClass.getDeclaredConstructor(int.class, String.class);
constructor1.setAccessible(true);//需要进行爆破【暴力破解】,使用反射可以访问private构造器/属性/方法
Object user2 = constructor1.newInstance(100, "张三丰");//constructor1对象是私有的,直接创建对象会报错,需要先进行爆破
System.out.println(user2);
}
}
class User {
private int age=20;
private String name="香茗";
public User() {
}
public User(String name) {
this.name = name;
}
private User(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
ReflecAccessProperty类:
package com.hspedu.reflection;
import java.lang.reflect.Field;
/*
反射操作属性
*/
public class ReflecAccessProperty {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {
//得到Student类对应的Class对象
Class<?> stuaClass = Class.forName("com.hspedu.reflection.Student");
//创建对象
Object o = stuaClass.newInstance();
System.out.println(o.getClass());//运行类型Student
//3.通过反射得到age属性对象
Field age = stuaClass.getField("age");
age.set(o,88);//通过反射操作类的属性
System.out.println(o);//Student{age=88,namenull}
System.out.println(age.get(o));//返回age属性的值
//4.使用反射操作name属性
Field name = stuaClass.getDeclaredField("name");
name.setAccessible(true);//name是私有的,不能直接访问,必须进行爆破
name.set(o,"懒汉");
System.out.println(o);//Student{age=88,name懒汉}
name.set(null,"老汉");//因为name是static属性,因此o也可以写出null
System.out.println(o);//Student{age=88,name老汉}
System.out.println(name.get(o));
System.out.println(name.get(null));//只有是静态的属性才能写null
}
}
class Student{
public int age;
private static String name;
public Student(){
}
@Override
public String toString() {
return "Student{" +
"age=" + age +","+
"name"+name+
'}';
}
}
ReflecAccessMethod 类:
package com.hspedu.reflection;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/*
反射调用方法
*/
public class ReflecAccessMethod {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
//1.得到Boss类对应的Class对象
Class<?> bossClass = Class.forName("com.hspedu.reflection.Boss");
//2.创建对象
Object o = bossClass.newInstance();
//3.调用public的hi方法对象
Method hi1 = bossClass.getMethod("hi", String.class);//获取共有的
hi1.invoke(o,"nihao");
Method hi = bossClass.getDeclaredMethod("hi",String.class);//可以获取所有
//调用
hi.invoke(o,"韩淑萍");
//4.调用私有的方法 say对象
Method say = bossClass.getDeclaredMethod("say", int.class, String.class, char.class);
say.setAccessible(true);
System.out.println(say.invoke(o,100,"张三",'男'));//say方法是私有的,需要爆破
//say方法是static的,还可以这样调用
System.out.println(say.invoke(null,200,"lisi",'女'));
//5.在反射中,如果方法有返回值,统一返回Object 但是它运行类型和方法定义的返回类型一致
Object reVal = say.invoke(null, 300, "王五", '男');
System.out.println(reVal);
System.out.println("raVal的运行类型="+reVal.getClass());//raVal的运行类型=class java.lang.String
}
}
class Boss{
public int age;
private static String name;
public Boss() {
}
private static String say(int n,String s,char c){
return n+" "+s+" "+ c;
}
public void hi(String s){
System.out.println("hi "+s);
}
}
Hmoeword01类:
package com.hspedu.reflection.homework;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Hmoeword01 {
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {
/*
提供getName的共有方法,利用Class类的私有属性的name属性,修改私有的name属性值,并调用getName()方法打印name
*/
//1.得到PrivateTest类对应的Class对象
Class<PrivateTest> privateTestClass = PrivateTest.class;
//创建对象实例
PrivateTest privateTestObj = privateTestClass.newInstance();
//得到name属性对象,name属性是私有的,所以用getDeclaredField
Field name=privateTestClass.getDeclaredField("name");
//4.爆破
name.setAccessible(true);
name.set(privateTestObj,"天龙八部");
//5.得到getName方法对象
Method getName = privateTestClass.getMethod("getName");
//6.因为getName是public,所以不用爆破
Object invoke = getName.invoke(privateTestObj);
System.out.println("name属性值="+invoke);
}
}
class PrivateTest{
private String name="hellokitty";
//有一个默认无参构造器
public String getName(){
return name;
}
}
Homework02类:
package com.hspedu.reflection.homework;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Homework02 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//Class类的forName方法得到File类的Class对象
Class<?> fileClass = Class.forName("java.io.File");
//2.得到所有的构造器
Constructor<?>[] declaredConstructors = fileClass.getDeclaredConstructors();
//遍历输出
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println("File的构造器"+declaredConstructor);
}
//3.指定得到 File的构造器public java.io.File(java.lang.String)
Constructor<?> declaredConstructor = fileClass.getDeclaredConstructor(String.class);
String fileAllPath="E:\\mynew .txt";
Object file = declaredConstructor.newInstance(fileAllPath);//创建File对象
//4.得到createNewFile对象
Method createNewFile = fileClass.getMethod("createNewFile");
createNewFile.invoke(file);
//file的运行类型就是File
System.out.println(file.getClass());
System.out.println("文件创建成功"+fileAllPath);
}
}